python变量命名的7条建议


Posted in Python onJuly 04, 2019

前言

Quora 问答社区的一个开发者投票统计,程序员最大的难题是:如何命名(例如:给变量,类,函数等等),光是如何命名一项的选票几乎是其它八项的投票结果的总和。如何给变量命名,如何让它变得有意义成了程序员不可逾越的难题,这篇文章参考了 Clean Code ,提供7条命名建议,希望能在取名字的过程中给你带来一些帮助。

以下都是基于Python3.7语法

1、使用有意义而且可读的变量名

ymdstr = datetime.date.today().strftime("%y-%m-%d")

鬼知道 ymd 是什么?

current_date: str = datetime.date.today().strftime("%y-%m-%d")

看到 current_date,一眼就懂。

2、同类型的变量使用相同的词汇

这三个函数都是和用户相关的信息,却使用了三个名字

get_user_info()
get_client_data()
get_customer_record()

如果实体相同,你应该统一名字

get_user_info()
get_user_data()
get_user_record()

极好 因为 Python 是一门面向对象的语言,用一个类来实现更加合理,分别用实例属性、property 方法和实例方法来表示。

class User:
  info : str

  @property
  def data(self) -> dict:
    # ...

  def get_record(self) -> Union[Record, None]:
    # ...

3、使用可搜索的名字

大部分时间你都是在读代码而不是写代码,所以我们写的代码可读且可被搜索尤为重要,一个没有名字的变量无法帮助我们理解程序,也伤害了读者,记住:确保可搜索。

time.sleep(86400);

What the fuck, 上帝也不知道86400是个什么概念

# 在全局命名空间声明变量,一天有多少秒
SECONDS_IN_A_DAY = 60 * 60 * 24

time.sleep(SECONDS_IN_A_DAY)

清晰多了。

4、使用可自我描述的变量

address = 'One Infinite Loop, Cupertino 95014'
city_zip_code_regex = r'^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$'
matches = re.match(city_zip_code_regex, address)

save_city_zip_code(matches[1], matches[2])

matches[1] 没有自我解释自己是谁的作用

一般

address = 'One Infinite Loop, Cupertino 95014'
city_zip_code_regex = r'^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$'
matches = re.match(city_zip_code_regex, address)

city, zip_code = matches.groups()
save_city_zip_code(city, zip_code)

你应该看懂了, matches.groups() 自动解包成两个变量,分别是 city,zip_code

address = 'One Infinite Loop, Cupertino 95014'
city_zip_code_regex = r'^[^,\\]+[,\\\s]+(?P<city>.+?)\s*(?P<zip_code>\d{5})?$'
matches = re.match(city_zip_code_regex, address)

save_city_zip_code(matches['city'], matches['zip_code'])

5、 不要强迫读者猜测变量的意义,明了胜于晦涩

seq = ('Austin', 'New York', 'San Francisco')

for item in seq:
  do_stuff()
  do_some_other_stuff()
  # ...
  # Wait, what's `item` for again?
  dispatch(item)

seq 是什么?序列?什么序列呢?没人知道,只能继续往下看才知道。

locations = ('Austin', 'New York', 'San Francisco')

for location in locations:
  do_stuff()
  do_some_other_stuff()
  # ...
  dispatch(location)

用 locations 表示,一看就知道这是几个地区组成的元组

6、不要添加无谓的上下文

如果你的类名已经可以告诉了你什么,就不要在重复对变量名进行描述

class Car:
  car_make: str
  car_model: str
  car_color: str

感觉画蛇添足,如无必要,勿增实体。

class Car:
  make: str
  model: str
  color: str

7、使用默认参数代替短路运算和条件运算

def create_micro_brewery(name):
  name = "Hipster Brew Co." if name is None else name
  slug = hashlib.sha1(name.encode()).hexdigest()
  # etc.

def create_micro_brewery(name: str = "Hipster Brew Co."):
  slug = hashlib.sha1(name.encode()).hexdigest()
  # etc.

这个应该能理解吧,既然函数里面需要对没有参数的变量做处理,为啥不在定义的时候指定它呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
python变量不能以数字打头详解
Jul 06 Python
Python解惑之True和False详解
Apr 24 Python
python实现简易版计算器
Jun 22 Python
python如何去除字符串中不想要的字符
Jul 05 Python
python使用生成器实现可迭代对象
Mar 20 Python
Python numpy中矩阵的基本用法汇总
Feb 12 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Python timeit模块原理及使用方法
Oct 10 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 #Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 #Python
python代理工具mitmproxy使用指南
Jul 04 #Python
Python批量修改图片分辨率的实例代码
Jul 04 #Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 #Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 #Python
python中比较两个列表的实例方法
Jul 04 #Python
You might like
PHP中的cookie不用刷新就生效的方法
2012/02/04 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP ADODB生成下拉列表框功能示例
2018/05/29 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
JavaScript 常用函数
2009/12/30 Javascript
js function定义函数使用心得
2010/04/15 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
详解python中__name__的意义以及作用
2019/08/07 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python实现京东抢秒杀功能
2021/01/25 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
大学推普周活动总结
2015/05/07 职场文书
大学生受助感言
2015/08/01 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis