【发布时间】:2017-03-19 23:51:42
【问题描述】:
python 的operator 模块有什么意义?那里有许多明显多余的功能,我不明白为什么要使用这些功能而不是其他方式来做同样的事情。
例如:
>>> import operator
>>> operator.truth(0)
False
>>> bool(0)
False
似乎做同样的事情。
【问题讨论】:
python 的operator 模块有什么意义?那里有许多明显多余的功能,我不明白为什么要使用这些功能而不是其他方式来做同样的事情。
例如:
>>> import operator
>>> operator.truth(0)
False
>>> bool(0)
False
似乎做同样的事情。
【问题讨论】:
鉴于bool 的存在,现在很难想到operator.truth 的任何用例。请注意,bool 是 2.2.1 中的新内容,并且操作符早于它,因此它可能由于历史原因现在才存在。 operator模块中还有其他一些无用的函数such as operator.abs,它只是调用了内置的abs。
虽然operator 中的所有内容都不是完全没用的,但运营商的C implementation(如果可用)可以提供比纯Python 实现更高的性能。对于通常由 lambda 函数处理的任务,itemgetter、attrgetter 和 methodcaller 函数更具可读性,并且通常可以更好地执行实用函数。
【讨论】:
有时能够访问运算符的功能但作为一个函数很有用。例如,您可以将两个数字相加。
>> print(1 + 2)
3
你也可以
>> import operator
>> print(operator.add(1, 2))
3
函数方法的一个用例可能是您需要编写一个计算器函数,该函数根据一个简单的公式返回一个答案。
import operator as _operator
operator_mapping = {
'+': _operator.add,
'-': _operator.sub,
'*': _operator.mul,
'/': _operator.truediv,
}
def calculate(formula):
x, operator, y = formula.split(' ')
# Convert x and y to floats so we can perform mathematical
# operations on them.
x, y = map(float, (x, y))
return operator_mapping[operator](x, y)
print(calculate('1 + 2')) # prints 3.0
【讨论】:
为了完整性和一致性。因为将所有操作符放在一个地方可以让您稍后进行动态查找:
getattr(operator, opname)(*arguments)
省略一些操作,因为它们是多余的,会破坏这个目的。由于 Python 名称只是引用,因此向 operator 模块添加一个名称既便宜又容易,这只是另一个引用。
【讨论】:
pandas 在他们的测试中使用了getattr(operator, ...)。