Инициировать функциональную команду при обнаружении слова - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь немного очистить свой код и в основном имею как можно меньше операторов if.В приведенном ниже коде, если в сообщении код обнаруживает определенное слово, я хочу, чтобы оно инициировало определенную функцию на основе этого слова.Я просто хочу сделать новую функцию для каждой новой «команды», которую нужно запустить, и не должен делать сопровождающий оператор if.Вот пример кода процесса

message = 'goo'

#Commands
def foo():
    print('bar')

def goo():
    print('ber')

def swoo():
    print('bat')

#Detect if word in message
if 'foo' in message:
    foo()
if 'goo' in message:
    goo()
if 'swoo' in message:
    swoo()

Каков наилучший способ достижения минимального количества операторов if, и когда я хочу добавить новую функцию, ей не требуется никакого дополнительного кода для ее работыпосле бега?

Ответы [ 3 ]

1 голос
/ 15 марта 2019

это идеальный вариант использования для декораторов Python. Сначала создайте декоратор (и глобальный запрос), чтобы запомнить свою функцию:

ALLCOMMANDS = {}
def commandfunction(function):
    ALLCOMMANDS[function.__name__] = function
    return function

Тогда выполняйте свои функции с помощью декораторов:

@commandfunction
def foo():
    print("bar")

и вы используете диктовку, чтобы найти команду:

command = read_from_user()
if command in ALLCOMMANDS:
    ALLCOMMANDS[command]()
0 голосов
/ 15 марта 2019

В идеале вы хотите добавить префикс к этим функциям и явно включить их. Для простоты я исключил встроенные функции.

fns = {f:globals()[f] for f in dir() if not f.startswith('__')}
rets = [v() for k,v in fns.items() if k in message]
0 голосов
/ 15 марта 2019
names = 'foo goo swoo'.split()

for name in names:
    if not (name in message):
        continue

    try:
        function = globals()[name] # get the function that has this name
    except KeyError:
        ... # if it's not there, do something
    else:
        function() # the function has been found, so call it!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...