开发规范
后端开发规范
代码规范
安全规范
常见 XSS 漏洞及解决方案
常用 XSS 测试 payload
常见越权漏洞及解决方案
常用越权测试方法
常见 CSRF 漏洞及解决方案
常见高危操作及对策
数据库设计和使用规范
MySQL 设计和使用规范
Redis 设计和使用规范
Django最佳实践
Python最佳实践
前端开发规范
HTML规范
CSS规范
JS规范
Vuejs 规范
PerformanceOpti
MobileSpec
安全检查
webpack
其他
测试规范
测试覆盖范围
测试隔离
-
+
首页
Python最佳实践
## 内置数据结构 ### BBP-1001 避免魔术数字 不要在代码中出现 [Magic Number](javascript:void(0)),常量应该使用 Enum 模块来替代。 ```python # BAD if cluster_type == 1: pass # GOOD from enum import Enum Class BCSType(Enum): K8S = 1 Mesos = 2 if cluster_type == BCSType.K8S.value: pass ``` ### BBP-1002 不要预计算字面量表达式 如果某个变量是通过简单算式得到的,应该保留算式内容。不要直接使用计算后的结果。 ```python # BAD if delta_seconds > 950400: return # GOOD if delta_seconds > 11 * 24 * 3600: return ``` ### BBP-1003 优先使用列表推导或内联函数 使用列表推导或内联函数能够清晰知道要生成一个列表,并且更简洁 ```python # BAD list_two = [] for v in list_one: if v[0]: new_list.append(v[1]) # GOOD one list_two = [v[1] for v in list_one if v[0]] # GOOD two list_two = list(filter(lambda x: x[0], list_one)) ``` ## 内置模块 ### BBP-1004 使用 operator 模块替代简单 lambda 函数 在很多场景下,`lambda` 函数都可以用 `operator` 模块来替代,后者效率更高。 #### 替代相乘函数 ```python # BAD product = reduce(lambda x, y: x * y, numbers, 1) # GOOD from operator import mul product = reduce(mul, numbers, 1) ``` #### 替代索引获取函数 ```python # BAD rows_sorted_by_city = sorted(rows, key=lambda row: row['city']) # GOOD from operator import itemgetter rows_sorted_by_city = sorted(rows, key=itemgetter('city')) ``` #### 替代属性获取函数 ```python # BAD products_by_quantity = sorted(products, key=lambda p: p.quantity) # GOOD from operator import attrgetter products_by_quantity = sorted(products, key=attrgetter('quantity')) ``` ### BBP-1005 logging 模块:尽量使用参数,而不是直接拼接字符串 在使用 `logging` 模块打印日志时,请尽量 **不要** 在第一个参数内拼接好日志内容(不论是使用何种方式)。正确的做法是只在第一个参数提供模板,参数由后面传入。 在大规模循环打印日志时,这样做效率更高。 参考:https://docs.python.org/3/howto/logging.html#optimization ```python # BAD logging.warning("To iterate is %s, to recurse %s" % ("human", "divine")) # BAD,但并非不可接受 logging.warning(f"To iterate is {human}, to recurse {divine}") # GOOD logging.warning("To iterate is %s, to recurse %s", "human", "divine") ``` ### BBP-1006 使用 `timedelta.total_seconds()` 代替 `timedelta.seconds()` 获取相差总秒数 ```python from datetime import datetime dt1 = datetime.now() dt2 = datetime.now() # BAD print((dt2 - dt1).seconds) # GOOD print((dt2 - dt1).total_seconds()) ``` 在源码中,seconds 的计算方式为:days, seconds = divmod(seconds, 24*3600) 表达式右侧 seconds 是总秒数,被一天的总秒数取模得到 seconds ```python @property def seconds(self): """seconds""" return self._seconds # in the `__new__`, you can find the `seconds` is modulo by the total number of seconds in a day def __new__(cls, days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0): seconds += minutes*60 + hours*3600 # ... if isinstance(microseconds, float): microseconds = round(microseconds + usdouble) seconds, microseconds = divmod(microseconds, 1000000) # !
吴晓俊
2024年7月15日 15:59
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码