Как вызвать сделать переменную вызываемой функцией в Python - PullRequest
0 голосов
/ 03 июня 2019

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

functions = ['add','sub','mul']
a = 10
b = 5

x = input('Choose a function : ')

def add():
    print(a+b)
def mul():
    print(a*b)
def sub():
    print(a-b)

x()

Я хочу, чтобы переменная 'x' вызывалась и выполнялась как функция.

Ответы [ 3 ]

1 голос
/ 03 июня 2019

Я думаю, правильное решение для этого будет dict.Также это дает вам некоторую гибкость, чтобы дать различные строковые ключевые слова для функций.Код:

def add(a, b):
    print(a + b)


def mul(a, b):
    print(a * b)


def sub(a, b):
    print(a - b)


functions = {
    'add': add,
    'sub': sub,
    'mul': mul
}

a = 10
b = 5

x = input('Choose a function : ')

if x not in functions:
    print(f"Function \"{x}\" is not defined.")
else:
    functions[x](a, b)

Но если вы считаете, что вызов функции по названию строки на 100% необходим, вы можете получить ссылку на функцию из globals():

func = globals().get(x, None)
if not x:
    print(f"Function \"{x}\" is not defined.")
else:
    func(a, b)
0 голосов
/ 03 июня 2019

eval() может сработать для вас, просто знайте, что это позволяет выполнять произвольный код, поэтому будьте осторожны с тем, как вы разрешаете передавать ему значения.

Например:

$ python
Python 3.7.2 (default, Feb 12 2019, 08:15:36) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def a():
...     print('a')
... 
>>> def b():
...     print('b')
... 
>>> func = eval('a')
>>> func()
a
>>> func = eval('b')
>>> func()
b
>>> 

Или с шагом выбора пользователя:

# ...
>>> func_choice = input('Choose a function: ')
Choose a function: a
>>> func = eval(func_choice)
>>> func()
a
>>> 
0 голосов
/ 03 июня 2019

Я заметил, что вы не используете functions, но вы что-то там делаете.Это должен быть словарь имен для функций

def add():
    ...

functions = {'add': add,'sub': sub, 'mul': mul}

choice = input('Choose a function : ')
f = functions[choice]

f()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...