Я уже дважды сталкивался с этой проблемой и, наконец, нашел безопасное и не уродливое решение (по моему скромному мнению).
RECAP предыдущих ответов:
globals - это хакерский, быстрый и простой метод, но вы должны быть супер согласованы с именами своих функций, и он может сломаться во время выполнения, еслипеременные перезаписываются.Кроме того, это непитонно, небезопасно, неэтично, Ядда Ядда ...
Словари (т. Е. Карты со строками в функции) безопаснее и проще в использовании ... но меня это раздражаетнет необходимости в том, чтобы мне приходилось распределять словарные назначения по моему файлу, которые легко потерять.
Декораторы сделали решение для словаря объединенным для меня.Декораторы - прекрасный способ добавить побочные эффекты и преобразования к определению функции.
Пример времени
fields = ['name', 'email', 'address']
# set up our function dictionary
cleaners = {}
# this function will add stuff into the dictionary
def add_cleaner(key):
# this is a parametered decorator, it returns the actual decorator
def actual_decorator(func):
# add func to the dictionary
cleaners[key] = func
return func
return actual_decorator
Каждый раз, когда вы определяете более чистую функцию, добавьте ее вобъявление:
@add_cleaner('email')
def email_cleaner(email):
#do stuff here
return result
Функции добавляются в словарь, как только они анализируются, и могут вызываться следующим образом:
cleaned_email = cleaners['email'](some_email)
Вы можете добавить эту строку вв нижней части вашего сценария, чтобы убедиться, что вы не забыли один.;)
assert(set(cleaners.keys()).issubset(fields))