2016-11-06 3 views
1

Что такое python's operator модуль? Есть много явно избыточных функций, и я не понимаю, почему следует предпочесть использовать эти функции, а не другие способы сделать то же самое.Зачем использовать функции в модуле оператора?

Например:

>>> import operator 
>>> operator.truth(0) 
False 
>>> bool(0) 
False 

, кажется, делают точно то же самое.

+1

Связанный: http://stackoverflow.com/q/22387166/674039 – wim

ответ

1

Для полноты и согласованности. Потому что имея все операторы в одном месте позволяете делать динамическую Lookups позже:

getattr(operator, opname)(*arguments) 

Опуская некоторые операции, потому что они являются избыточными бы победить эту цель. И поскольку имена Python - это просто ссылки, дешево и легко добавить имя в модуль operator, что является просто еще одной ссылкой.

+0

Не очень убедительный ответ для меня, потому что разные операции принимают различное количество аргументов. – wim

+1

@wim: Я динамически передавал аргументы. Вы можете тривиально группировать операторы строк в группы по числу операторов, которые они принимают. –

+0

Не понимайте прецедентов и, кажется, нарушаете «один очевидный способ сделать это». Знаете ли вы о каком-либо проекте в github, где код действительно использовал динамический поиск на модуле оператора, как это? – wim

5

Его иногда полезно иметь доступ к функциональности оператора, но как функция. Например, чтобы добавить два числа вместе, вы могли бы сделать.

>> 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 
1

Учитывая существование bool, это трудно думать о каком-либо потребительном случае для operator.truth этих дней. Обратите внимание, что bool был новым в 2.2.1, и оператор предшествует этому, поэтому он может существовать только по историческим причинам. В операционном модуле есть и другие бесполезные функции, такие как operator.abs - который просто вызывает встроенный abs.

Операционный модуль иногда полезен для функционального программирования. Например, Python имеет встроенную функцию sum, но пренебречь включением аналогичной функции product. Это может быть реализовано с использованием succintly функциональный интерфейс оператора умножения:

>>> from operator import mul 
>>> from functools import reduce 
>>> def product(sequence, start=1): 
...  return reduce(mul, sequence, start) 
... 
>>> product([7, 2, 3]) 
42 

Это правда, что существуют и другие способы реализации этого. Вероятно, процедурный метод, то есть использование простого старого цикла и накопления с помощью оператора *, более питонов.

Для пользователей, которые по каким-либо причинам, предпочитают не использовать императивный стиль, модуль оператор предлагает более вкусную реализацию, чем при использовании анонимных функций

>>> timeit reduce(lambda x, y: x*y, range(1, 100)) 
10000 loops, best of 3: 24.3 µs per loop 
>>> timeit reduce(mul, range(1, 100)) 
100000 loops, best of 3: 14.9 µs per loop 

оператора C implementation (если таковые имеются) предлагает прирост производительности по сравнению с inferior lambda версия. Функции itemgetter, attrgetter и methodcaller, предоставляемые в операторском модуле, также предлагают более читаемые и более эффективные параметры для простых задач, которые часто обрабатываются анонимными функциями.