Вызов встроенных операторов косвенно в Python - PullRequest
2 голосов
/ 12 февраля 2009

Допустим, у вас есть небольшая программа-калькулятор, которая принимает числа и оператор для выполнения этих чисел в качестве входных данных, а затем распечатывает результат применения указанной операции. Поэтому, если вы введете «4 + 5», он выведет «9». Просто, правда? Хорошо, что я хочу иметь возможность написать что-то такое:

a, op, b = raw_input().split()
print somehowInvokeOperator(op, a, b)

Проблема заключается в том, что "каким-то образом InvokeOperator ()" часть. Можно ли как-то сделать это, не прибегая к (a) eval () или (b) к каким-то типам ключей отображения словаря, таких как «+» и «-», к функциям, которые выполняют соответствующую операцию? getattr () не работает для этого. Мне действительно не нужен этот код для чего-либо, мне просто любопытно посмотреть, может ли это быть решено в Python так же элегантно, как и в других динамических языках.

Ответы [ 3 ]

7 голосов
/ 12 февраля 2009

По сути, нет, вам, по крайней мере, потребуется словарь или функция для сопоставления символов оператора с их реализациями. На самом деле все немного сложнее, поскольку не все операторы принимают форму a [op] b, поэтому в общем случае вам потребуется выполнить небольшой анализ; см. https://docs.python.org/library/operator.html для полного списка соответствий и для функций, которые вы, вероятно, захотите использовать для реализаций операторов.

Если вы пытаетесь реализовать только двоичные арифметические операторы, такие как + - * /% **, тогда словарь должен быть достаточно хорошим.

2 голосов
/ 12 февраля 2009

Предупреждение: это совсем не пифония !! (идет вразрез с каждым правилом Zen of Python !)

Вот волшебный , однострочный словарь:

ops = eval( '{%s}'%','.join([('\''+op + '\' : lambda a,b: a ' + op + ' b') for op in '+-*/%']) )

Это определяет ваш словарь .. который вы можете использовать

ops['+'](10,4) #returns 14

Основная идея - сопоставить каждый оператор с лямбда-функцией:

{ '+' : lambda a,b: a + b }
2 голосов
/ 12 февраля 2009

Если вы действительно хотите это сделать, вам понадобится стандартный модуль operator. См. Также Эмуляция числовых типов . И да, словарь, полный функций, был бы идеальным динамичным способом сделать это.

import operator
operations = {'+' : operator.add}
result = operations[op](a, b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...