【发布时间】:2021-02-07 17:59:16
【问题描述】:
在 Flask 应用程序的业务逻辑上下文中,我正在编写 大量 类的这些“定义”实例,将它们放在一个列表中,并在需要的地方导入该列表.在构建它之外,列表被视为静态的。
简化示例:
definitions.py:
from my_object import MyObject
definition_registry = list()
# team 1, widget 1 definition
_definition = MyObject()
_definition.name = "team 1 widget 1"
_definition.coercer = str
definition_registry.append(_definition)
# team 1, widget 2 definition
_definition = MyObject()
_definition.name = "team 1 widget 2"
_definition.coercer = int
definition_registry.append(_definition)
# team 2, widget 1 definition
_definition = MyObject()
_definition.name = "team 2 widget 1"
_definition.coercer = float
definition_registry.append(_definition)
my_object.py:
class MyObject:
def __init__(self):
self.name = "unnamed"
self.coercer = int
def __repr__(self):
return f"MyObject instance: {self.name} / {self.coercer}"
main.py:
from definitions import definition_registry
if __name__ == '__main__':
print(definition_registry)
输出:
[MyObject instance: team 1 widget 1 / <class 'str'>, MyObject instance: team 1 widget 2 / <class 'int'>, MyObject instance: team 2 widget 1 / <class 'float'>]
如何将definitions.py 拆分为多个文件(team_1.py、team_2.py、...)?
重要提示:真正的 MyObject 的实例必须在 python 中定义。在我的示例中,coercer 属性旨在作为一个占位符来强化这一事实。
我曾考虑过使用exec,但这通常是一种不好的做法,而且这似乎不是该规则的一个好的例外。例如,将 definitions.py 的第 5 到 9 行放入 team1w1.py 并用 exec(open(team1w1.py).read()) 替换它们是可行的,但 PyCharm 的调试器不会逐行执行 team1w1.py。
另一种方法是做类似的事情
from team1w1 import definition
definition_registry.append(definition)
from team1w2 import definition
definition_registry.append(definition)
...
这更好,但它仍然闻起来,因为
-
from ... import definition在同一个文件中一遍又一遍地重复 -
import MyObject必须为每个定义文件重复
【问题讨论】: