Python 在 "compilation" 时将变量传递给导入的模块

Python pass variable to imported module at "compilation" time

我正在尝试从自定义 class 创建一个带有装饰器的对象。 然后我需要使用该对象的装饰器在不同的文件中创建一堆函数。 我在网上找到了使用 builtins 的解决方案,但感觉有点 hacky,让我的 lsp 吐出一堆错误。

我想知道是否有人知道更好的解决方案。

这是我的文件结构:

main.py
mylib
├── A.py
└── B.py

main.py

import builtins

from mylib.A import A

a = A("This is printing in the decorator")
builtins.FOO = a
import mylib.B as B

B.foo()
B.poo()

A.py

class A:
    def __init__(self, _message):
        self.message = _message
    def our_decorator(self, func):
        def function_wrapper():
            print(self.message)
            func()
        return function_wrapper

B.py

import builtins

@builtins.FOO.our_decorator
def foo():
    print("foo")

@builtins.FOO.our_decorator
def poo():
    print("poo")

如果可以避免,我不想更改文件结构。

使用内置函数来神奇地创建装饰器确实很 hacky。

另一种方法是从 main 中修补 B 中的函数。它稍微干净一点(并且 linters 不应该抱怨)因为 B 模块不再需要知道装饰器:

main.py:

from mylib.A import A

a = A()

import mylib.B as B

# decorate here the functions of the B module
B.foo = a.our_decorator(B.foo)
B.poo = a.our_decorator(B.poo)

B.foo()
B.poo()

A.py不变...

B.py:

def foo():
    print("foo")

def poo():
    print("poo")

由于一个进程中只有一个版本的模块,您甚至可以使用第三个模块中的 B 的功能,前提是:

  • 要么是装饰后导入
  • 或者它只导入模块名称 (import mylib.B as B) 而不是直接导入函数 (from mylib.B import foo)