Python динамические имена функций

Попробуйте

def get_main(name):
    def helper1():
        print("helper1")
    def helper2():
        print("helper2")
    def main1():
        print("Running helpers from main1")
        helper1()
        helper2()
    def main2():
        print("Running helpers from main2")
        helper1()
        helper2()
    if name == "main1":
        return main1
    if name == "main2":
        return main2


main1 = get_main("main1")
main2 = get_main("main2")

Затем вы можете запустить функцию следующим образом:

main1()
main2()
helper1()

вывод:

Running helpers from main1
helper1
helper2
Running helpers from main2
helper1
helper2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'helper1' is not defined
9
задан drjeep 25 March 2009 в 10:17
поделиться

8 ответов

Канонический способ сделать это должно использовать словарь для эмуляции switch или if/elif. Вы найдете несколько вопросов подобным проблемам здесь на ТАК.

Поместите свои функции в словарь с Вашими кодами состояния как ключи:

funcs = {
    'CONNECT': connect,
    'RAWFEED': rawfeed,
    'RAWCONFIG' : rawconfig,
    'TESTFEED': testfeed
}
funcs[status](*args, **kwargs)
19
ответ дан 4 December 2019 в 05:51
поделиться

Вы могли бы найти getattr полезный, я предполагаю

import module
getattr(module, status.lower())(*args, **kwargs)
39
ответ дан 4 December 2019 в 05:51
поделиться

предположение, что эти функции принадлежат некоторому модулю:

import module
return getattr(module, status.lower()).__call__(*args, **kwargs)
15
ответ дан 4 December 2019 в 05:51
поделиться

это швы, что можно использовать getattr в немного отличающемся (по-моему, более изящный путь)

import math
getattr(math, 'sin')(1)

или если функция импортируется как ниже

from math import sin

грех находится теперь в пространстве имен, таким образом, можно назвать его

vars()['sin'](1)
5
ответ дан 4 December 2019 в 05:51
поделиться

Некоторое улучшение ответа SilentGhost:

globals()[status.lower()](*args, **kwargs)

если Вы хотите назвать функцию, определяемую в текущем модуле.

Хотя это выглядит ужасным. Я использовал бы решение со словарем.

4
ответ дан 4 December 2019 в 05:51
поделиться
3
ответ дан 4 December 2019 в 05:51
поделиться

Я встретился с той же проблемой ранее. Взгляните на этот вопрос, я думаю, что Вы ищете.

Словарь или если операторы

Надежда это полезно

Eef

1
ответ дан 4 December 2019 в 05:51
поделиться

некоторое изменение от предыдущего:

funcs = {
'CONNECT': connect,
'RAWFEED': rawfeed,
'RAWCONFIG' : rawconfig,
'TESTFEED': testfeed
}

func = funcs.get('status')
if func:
    func(*args, **kwargs)
-1
ответ дан 4 December 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: