不要这样做。如果你不确定是否需要这个,你就不需要。让一个模块可调用是一件很奇怪的事情。然而,这是一个有趣的智力好奇心,所以…
可以这样做,利用这样一个事实:一个模块本身就是一个对象,如果一个对象的类具有
__call__
方法。
然而,一个问题是
module
是内置的,不能修改内置的属性。
因此,最简单的解决方案是创建一个类来代替模块
sys.modules
,但也有一个
阿尔卡拉尔
方法。
在
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!