使分析结果更加有用和相关是我们DeepSource的主要目标之一,我们定期为我们的核心分析器增加更多的功能。
1.不使用with 来打开文件
当你在没有使用with 语句的情况下打开一个文件时,你需要记得在处理完后通过显式调用close() 来关闭文件。即使在显式关闭资源时,也有可能在资源真正被释放之前出现异常。这可能导致不一致,或者导致文件被破坏。通过with 打开文件实现了上下文管理协议,当执行在with 块之外时释放资源。
2.不必要地使用list/dict/set 的理解力
内置函数如all,any,enumerate,iter,itertools.cycle,itertools.accumulate, 可以直接与生成器表达式一起工作。它们不需要理解性。
除了它们之外:Python 中的all() 和any() 也支持短路,但如果使用了理解,这种行为就会消失。这影响了性能。
坏的做法:
...
comma_seperated_names = ','.join([name for name in my_fav_superheroes])
好的做法:
...
comma_seperated_numbers = ','.join(name for name in my_fav_superheroes)
3.不必要地使用生成器
在调用list,dict 或set 的过程中使用生成器表达式是没有必要的,因为这些类型都有相应的理解力。与其在生成器表达式周围使用list/dict/set ,不如把它们写成各自的理解式。
不好的做法:
squares = dict((i,i**2) for i in range(1,10))
好的做法:
squares = {i: i**2 for i in range(1,10)}
4.在函数调用中返回一个以上的对象类型
在一个函数中拥有不一致的返回类型,会使代码变得混乱和复杂,难以理解,并可能导致难以解决的错误。如果一个函数应该返回一个给定的类型(如整数常数、列表、元组),但也可以返回其他的东西,那么该函数的调用者将总是需要检查返回的值的类型。建议从一个函数中只返回一种类型的对象。
如果在某些失败的情况下需要返回空的东西,建议引发一个可以被干净地捕获的异常。
5.不使用get() 来从字典中返回默认值
这种反模式影响了代码的可读性。通常我们看到的代码是创建一个变量,给它分配一个默认值,然后检查字典中的某个键。如果该键存在,那么该键的值就被分配到变量的值中。虽然这样做没有错,但是这样做很啰嗦,而且效率很低,因为它查询了两次字典,而使用字典的get() 方法就可以轻松完成。
坏的做法:
currency_map = {'usd': 'US Dollar'}
if 'inr' in currency_map:
indian_currency_name = currency_map['inr']
else:
indian_currency_name = 'undefined'
好的做法:
currency_map = {'usd': 'US Dollar'}
indian_currency_name = currency_map.get('inr', 'undefined')
6.不使用items() 来迭代一个 dictionary
在 dictionary 上的items 方法会返回一个包含键值图元的可迭代文件,这些图元可以在for 循环中被解包。这种方法是习惯性的,因此推荐使用。
7.不使用字面语法来初始化空list/dict/tuple
通过调用dict() 来初始化一个空的字典比使用空的字面意义要相对慢一些,因为必须在全局范围内查找名称dict ,以防它已经被反弹了。其他两种类型也是如此 -list() 和tuple() 。
8.在生产代码中推送调试器
我们中的大多数人都至少做过一次这样的事情--在调试代码时,可能会发生在发现错误后推送代码,但却忘记删除调试器。这很关键,会影响代码的行为。强烈建议在签入前对代码进行审计,删除调试器的调用。