【发布时间】:2009-12-16 20:41:02
【问题描述】:
假设我有这个函数签名:
def foo(a=True, b=True, c=True, d=True, e=True):
考虑到所有传递的参数都应该是False,我决定这些是调用此函数的简洁方法:
foo(*5*[False])
foo(*[False]*5)
但有件事告诉我那将是糟糕的 Python 风格。你怎么看?
【问题讨论】:
标签: python
假设我有这个函数签名:
def foo(a=True, b=True, c=True, d=True, e=True):
考虑到所有传递的参数都应该是False,我决定这些是调用此函数的简洁方法:
foo(*5*[False])
foo(*[False]*5)
但有件事告诉我那将是糟糕的 Python 风格。你怎么看?
【问题讨论】:
标签: python
如果很难阅读,那就是糟糕的风格。
请记住,阅读代码的次数很多多于编写的次数。
【讨论】:
我喜欢使用默认值遵循 80-20 规则。如果一个函数的参数有默认值,而我选择使用不同的值,我需要在调用中说明这一点,因为这是一条重要的信息。
如果您实际上要“违反”五个默认参数,我会在调用中明确显示这一点,以使读者清楚。即,我会按名称明确列出每个参数并指出错误。
虽然您编写的代码应该可以工作,但它会分散注意力,并且有人会专注于弄清楚您到底在做什么,而不是意识到重要的一点 - 您正在打一个非常特殊的电话,因为您没有接听任何默认值。这里不是保存(电子)树木的地方。
【讨论】:
您的代码应该能够自我解释并且易于阅读。 Style Guide for Python 给出了这个例子,应该有助于回答你的问题:
使用 ''.startswith() 和 ''.endswith() 而不是字符串切片来检查 前缀或后缀。
startswith() 和 endswith() 是 更干净,更不容易出错。对于
示例:
Yes: if foo.startswith('bar'): No: if foo[:3] == 'bar':
【讨论】: