python - 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'}
所以我的问题有两个:
- 这是在主应用程序之外拥有用户定义函数的好方法吗?
- 在rules.py模块中需要修改哪些数据才能得到mod1和mod2修改的数据?
编辑
如果我省略了from main import add_modifier
rules.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
解决方案
我对装饰器并不是很熟悉,所以也许其他人可以就此提出建议。
但考虑到你在做什么,我认为为用户创建一个类来添加功能将具有你正在寻找的功能。
这个线程的东西:有没有办法循环并执行Python类中的所有函数?
一种建议的解决方案确实使用了装饰器,因此可以阐明如何更好地构建您的结构。
推荐阅读
- gcc - 如何在 gitlab CI 中检测编译器警告
- javascript - 将 for 循环保存为变量或将其保存在 Gsheet 中
- r - Spotfire 在 R 中使用文档属性
- android - 使用 com.google.android.gms.maps.GoogleMap.MoveCamera 时,Googlemap 有时会导致应用程序崩溃
- python - 如何避免卷积神经网络中的 ZeroPadding
- php - Laravel 访问被拒绝连接数据库
- postgresql - docker 容器中的 Postgresql 版本与其数据不兼容
- node.js - 返回 res.redirect() 在 NodeJS 中不起作用
- php - 在 Manjaro (Arch Linux) 上安装 Magento 2 ~ 缺少 php 扩展
- go - 使用 aws-sdk-go 拦截和转发 DynamoDB 流量