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
)
我正在尝试从自定义 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
)