同事!给出了几个采用相同参数的函数。
def func1(a):
print('Первая функция')
return a
def func2(a):
print('Вторая функция')
return a
脚本从某个地方(例如,从存储配置的文件或从标准输入,这并不重要)接收有关运行哪些函数和不运行哪些函数的设置。
dic_flag = {'fun1': True, 'fun2': False}
您可以编写一堆条件语句来运行这些函数。
if dic_flag['fun1']:
print(func1(a))
if dic_flag['fun2']:
print(func2(a))
但我想自动化这个过程,例如,像这样:
def func1(a):
print('Первая функция')
return a
def func2(a):
print('Вторая функция')
return a
dic_flag = {'fun1': True, 'fun2': False}
dic_func = {'fun1': func1, 'fun2': func2}
a = 10
for flag in dic_flag:
if dic_flag[flag]:
print(dic_func[flag](a))
问题
你能为这项任务想出什么漂亮的东西?也许是 OOP 中的一些东西?或者有没有标准库?实际上有几十个功能。
选修的:
如果主要参数相同,但一些附加参数不同怎么办?
您可以创建一个类来根据设置管理函数调用:
作为奖励,我补充说 dic_func 字典是使用 dic_flag 中指定的键自行组装的。键必须与函数名称匹配。禁用功能不包含在词典中。
如果字典包含 fun1,并且函数应该有不同的名称,您也可以发挥创意:
经过更多思考后,我可以提出这样的思路:
请允许我再曲解一下,现在转储一下函数本身:
或者像这样:
您还可以不保存函数字典,而是保存函数列表:
并通过索引调用必要的函数:
因此,您可以将函数拆分为单独的转储并仅加载必要的函数。
您甚至可以深入研究并使用字符串表示形式来创建函数。您可以使用 exec() 或 eval() 来执行此操作:
因此,您可以从文件中以字符串的形式加载必要的函数并执行它们。
您可以按照您喜欢的任何方式运行函数:
一切都已经适合你了,你懒得检查。
作为
python程序员,我们希望让代码更加简洁、美观。但最重要的规则是它易于理解且有效。我采用了一种更通用的方法,尽管乍一看代码可能看起来很复杂。一般来说,要理解这段代码,了解 OOP 的基础知识很重要。我还稍微修改了您的配置 - 您通常有机会向函数添加不同的参数,或者根本不添加它们。该代码还提供了使用文件中所描述的类中的方法的方法,当然,如果它们在那里,那么它们也将被正确识别,即使它是一个包装的@staticmethod,@classmethod或者什么都没有 - 在这种情况下,我通过类作为值self,即我自己,在我的上下文中它会是func(class_ref)。代码本身:
Ваш файл с функциями
function_module.pyВаш файл вызова логики
app.pyВывод:
Преимущества:
Подключить мой класс для вас будет очень просто, так как все что вы делаете, так это в конструктор передаете сам импорт вашего модуля, и конфигурацию.
Вам не нужно заморачиваться с логикой, которая написана внутри моего класса в отличие от других приведенных ответов где логику придется применять каждый раз для разных вызовов. Плюс там много ненужных вариантов, которые может быть написал вообще
chatgpt(извините, если кого-то обидел :) ).Мой класс вызывает только те функции, которые вы сами явно прописали в модуле, исключая импорты. Это означает, что вам не нужно руками прописывать все функции и методы, получать ссылки на них в словарь - класс сделает все сам.
Важно понимать, что параметры нужно внимательно передать в функции/методы, если все же требуется такая логика, иначе будет ошибка (как и при обычном запуске).
В целом я вообще не рекомендую использовать такой подход в программировании, так как логика выглядит достаточно запутанной и другим программистам будет сложно разобраться, где и какая функция вызывается. Не рекомендую и вашу идею с получением с внешнего источника и запуск таким образом функций. Лучше всего сделать какой-нибудь главный метод, который принимает аргументы, и уже на основе них запускать ваши функции. В качестве альтернативы посмотрите на
match-case, который добавили вpython 3.10он может показаться вам полезным.UPDATE:
Подумал, что вдруг вам не нужна такая навороченная логика, а нужно что-то максимально приближено к той задаче, которую вы привели, то упростил логику и подогнал под ваш вариант с функциями.
В целом задача оказалось интересной, был рад решить ее и помочь вам. Желаю успехов