是否可以通过参数调用模块?
我试图按照问题及其答案Callable modules,在Python上制作一个可调用的模块,像这样:
foo.py
import sys
class foo(object):
def __call__(self):
return 'callable'
sys.modules[__name__] = foo()
然后我称之为:
import foo
print(foo()) # 'callable'
但是我的目标是在可调用模块中传递参数:
print(foo('parameter'))
任何想法我该如何完成?
答案 0 :(得分:0)
您创建的类没有什么特别的(它甚至不是ModuleType
子类),因此它的__call__
方法也没有什么特别。如果要使用参数调用它,只需将参数添加到__call__
定义中:
import sys
class foo(object):
def __call__(self, x):
return f'callable, and called with {x}'
sys.modules[__name__] = foo()
现在,您可以像其他所有可调用对象一样为它传递一个参数:
import foo
print(foo('hello'))
callable, and called with hello
您已从评论中尝试这样做:
def __call__(a, self):
return a
但是,像Python中的所有方法一样,__call__
希望self
排在第一位。它不关心名称(除非您使用关键字参数调用它),只关心顺序:第一个参数获取接收者(foo
中的foo('hello')
),即使您调用了该参数a
,即使您调用了该参数'hello'
,第二个参数也将获得第一个普通参数(self
)。
因此,您将模块foo
作为第一个参数a
传递给您,而您return a
则返回foo
。
这就是为什么你得到这个:
<sta.foo object at 0x10faee6a0>
这不是错误,它是打印未定义__repr__
或__str__
的类的实例时获得的完全有效的输出。