我想将模块编写为函数而不是类。
有没有办法使这项工作按预期进行?
greet.py
def main(x):
print(f'Hello {x}!')
现在如何编写模块,以便在执行greet
时运行main
。
main.py
import greet
greet('Foo') # output: Hello Foo!
答案 0 :(得分:1)
请勿执行此操作。如果不确定是否需要此功能,则不需要。使模块可调用是一件很奇怪的事情。但是,这是一种有趣的求知欲,所以...
可以利用模块本身就是对象,并且如果对象的类具有__call__
方法则可以调用对象的事实来做到这一点。
但是,一个问题是module
是内置的,您不能修改内置的属性。
因此,最简单的解决方案是创建一个类,该类将代替sys.modules
中的模块,但也具有__call__
方法。
在greet.py
中:
import sys
class CallableModule():
def __init__(self, wrapped):
self._wrapped = wrapped
def __call__(self, *args, **kwargs):
return self._wrapped.main(*args, **kwargs)
def __getattr__(self, attr):
return object.__getattribute__(self._wrapped, attr)
sys.modules[__name__] = CallableModule(sys.modules[__name__])
def main(x):
print(f'Hello {x}!')
从外壳:
>>> import greet
>>> greet('there')
Hello there!
答案 1 :(得分:0)
对象,类或函数可以调用,但模块不能调用。
但是,您可以方便地命名事物:
[greet.py]
def greet(x):
...
[main.py]
from greet import greet
greet('foo')