Как сгенерировать динамическое имя функции и вызвать его с помощью пользовательского ввода в Python - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть функция от 10 до 20 с одинаковым именем префикса, и я должен вызывать их в соответствии с пользовательским вводом, но я не понимаю, как их вызывать, я пытался использовать метод ниже, но он не работает, Может кто-нибудь сказать мне, как следуетЯ делаю функцию вызываемой.

def pattern_1(no):
    print('First Pattern with ' +str(no)+ ' rows')

def pattern_2(no):
    print('Second Pattern with ' +str(no)+ ' rows')


rows = eval(input('Enter number of rows: '))
pattern_no = eval(input('Enter pattern num [1-10]: '))

cust_fun_name = 'pattern_' + str(pattern_no)

print(cust_fun_name) # Here its print pattern_2 but why function is not get invoked
cust_fun_name()

Когда я запускаю код выше, я получаю ошибку ниже

Traceback (most recent call last):                                                                                
  File "/home/main.py", line 22, in <module>                                                                      
    cust_fun_name()                                                                                               
TypeError: 'str' object is not callable

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Если вы действительно хотите сделать это таким образом, вы можете использовать eval():

def pattern_1(no):
    print('First Pattern with ' +str(no)+ ' rows')

def pattern_2(no):
    print('Second Pattern with ' +str(no)+ ' rows')

rows = input('Enter number of rows: ')
pattern_no = input('Enter pattern num [1-10]: ')

cust_fun_name = 'pattern_' + pattern_no
print(cust_fun_name) 
eval(cust_fun_name+"("+rows+")") # This is how you use eval()

# Enter number of rows: >? 10
# Enter pattern num [1-10]: >? 1
# pattern_1
# First Pattern with 10 rows

Однако, я думаю, вы должны следовать ответу Робина, это законный способ использования Python.

0 голосов
/ 17 сентября 2018
def pattern_1(no):
    print('First Pattern with ' +str(no)+ ' rows')

def pattern_2(no):
    print('Second Pattern with ' +str(no)+ ' rows')


rows = eval(input('Enter number of rows: '))
pattern_no = eval(input('Enter pattern num [1-10]: '))

pattern_2(no)
cust_fun_name = 'pattern_' + str(pattern_no)

print(cust_fun_name) # Here its print pattern_2 but why function is not get invoked

eval(cust_fun_name)()
0 голосов
/ 17 сентября 2018

, если сопоставление является статическим, либо выполнить сопоставление имени функции с объектом функции

mapping = {
  "pattern_1": pattern_1,
  "pattern_2": pattern_2
}

#do not use `eval` on user input!
pattern_no = input('Enter pattern num [1-10]: ')

cust_fun_name = 'pattern_' + str(pattern_no)
cust_func = mapping[cust_fun_name]
# call the function
cust_func()

или получить объект функции непосредственно из локального пространства имен

cust_func = locals()['pattern_' + str(pattern_no)]
cust_func()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...