【问题标题】:Avoid circular reference with decorator that takes argument from another script避免使用从另一个脚本获取参数的装饰器进行循环引用
【发布时间】:2026-01-04 09:55:02
【问题描述】:

我有两个文件...

utils.py:

def decorator(connection):
    def _decorator(f):
        def wrapper(*args, **kwargs):
            print(f'Connected to {connection}:')
            f(*args, **kwargs)
        return wrapper
    return _decorator

@decorator(db)
def do_thing(*args):
    for arg in args:
        print(arg)

run.py:

from utils import do_thing 

db = 'db_connection'
do_thing('A', 'B', 'C')

utils.py 包含一个连接到数据库的装饰器。

问题:run.py 导入 utils.py,但 utils.do_thing 装饰有我最终想从 run.py 传递的参数。

我如何调整事情以 A) 使这项工作和 B) 避免循环引用。

【问题讨论】:

    标签: python decorator python-decorators


    【解决方案1】:

    您可以使用第三个文件,例如shared.py,在其中定义db。 然后你可以从两个文件中导入它:

    shared.py:

    # prepare db stuff here
    db = …
    

    utils.py:

    from shared import db
    def decorator():
        …
    @decorator(db)
    def do_thing(*args):
        …
    

    运行.py:

    from utils import do_thing
    do_thing(…)
    

    【讨论】:

    • 好主意!但我想我想把它保持在两个,因为我希望用户只需要在一个文件中定义东西(数据库连接可能不同)
    • 然后你可以尝试导入完整的模块: import run run.db 和 import utils utils.do_thing 这提高了python解决循环依赖的能力。