首页 > 解决方案 > Python - 从导入的模块注册函数

问题描述

我正在尝试确定实现我的应用程序的最佳方式,其中将有一个主程序(main.py)和一个单独的规则模块(rules.py),其中可以编写任意数量的规则并且它们都将被应用在 main.py 中操作一些数据(字典)。应用程序的用户可以在 rules.py 中添加他们的自定义规则,而不会影响 main.py 中的逻辑。

我在想装饰器在这里以 main.py 可以迭代它们的方式注册 rules.py 中的每个函数很有用,但我不确定确切的实现。这是我的骨架代码。

主文件

import rules

modifiers = [] # List of fuctions to modify data

def add_modifier(f):
  modifiers.append(f)
  return f

def invoke_modifiers(data):
  for modifier in modifiers:
    data = modifier(data)
  return data

if __name__ == "__main__":
  data = {'foo': 'bar'}
  print(f"Invoking modifiers on data: {data}")
  data = invoke_modifiers(data)
  print(f"Done invoking modifiers: {data}")

规则.py

from main import add_modifier

@add_modifier
def mod1(data):
  data['foo'] = 'baz'
  return data

@add_modifier
def mod2(data):
  data['quz'] = 'qux'
  return data

但是当我执行代码时,它不会修改我的数据。

$ python main.py
Invoking modifiers on data: {'foo': 'bar'}
Done invoking modifiers: {'foo': 'bar'}

所以我的问题有两个:

  1. 这是在主应用程序之外拥有用户定义函数的好方法吗?
  2. 在rules.py模块中需要修改哪些数据才能得到mod1和mod2修改的数据?

编辑

如果我省略了from main import add_modifierrules.py 中的内容,我会在执行过程中得到以下信息:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    import rules
  File "/home/telorb/Python/registerTest/rules.py", line 3, in <module>
    @add_modifier
NameError: name 'add_modifier' is not defined

标签: pythonfunctionmoduledecorator

解决方案


我对装饰器并不是很熟悉,所以也许其他人可以就此提出建议。

但考虑到你在做什么,我认为为用户创建一个类来添加功能将具有你正在寻找的功能。

这个线程的东西:有没有办法循环并执行Python类中的所有函数?

一种建议的解决方案确实使用了装饰器,因此可以阐明如何更好地构建您的结构。


推荐阅读