我有三个模块a.py,b.py和c.py. a.py模块是基础模块。我想要实现的是当b.py导入a.py时以及当c.py导入a.py时会有不同的行为。例如:
a.py
def ab():
return 5
def ac():
return 6
if __nameoftheimportmodule__ == 'b':
x = ab()
elif __nameoftheimportmodule == 'c':
x = ac()
else:
pass
因此,请像这样调用 b.py :
b.py
import a
print(a.x)
将返回5(对于 c.py ,它将返回6)。
我的问题是这样的设计是否可行(例如,是否存在与上述名称的导入模块相同的功能)?
答案 0 :(得分:0)
我能找到匹配该行为的最接近的解决方案是使用inspect
module's stack function:
import inspect
def ab():
return 5
def ac():
return 6
if inspect.stack()[1][1] == 'b.py':
x = ab()
elif inspect.stack()[1][1] == 'c.py':
x = ac()
else:
pass
inspect.stack()
:返回调用者堆栈的帧记录列表。第一个条目 在返回的列表中表示调用者;最后一个条目代表 堆栈中最外层的调用。
从inspect.stack()
调用a.py
时,我们会
[(<frame object at 0x102c25dd0>, '/Users/home/43985900/a.py', 3, '<module>', ['print inspect.stack()\n'], 0), (<frame object at 0x102c25c20>, 'c.py', 1, '<module>', ['print(a.x)\n'], -1)]
我们感兴趣的是“最后一个条目表示堆栈中最外层的调用”,因此我们将stack
索引为stack[1][1]
以获取'c.py'
,我们将其与调用模块进行比较文件名。
现在,当我们测试运行模块时,我们得到了预期的输出:
$ python c.py
6
$ python b.py
5
改编自这个问题的答案:Get name of calling function's module in Python。
答案 1 :(得分:0)
你必须很难搞定导入系统,特别是因为通常情况下,当第二个模块导入时,模块的代码甚至不会再次运行。 Python将重用第一次导入时创建的相同模块对象,并存储相同的x
值。
你可以通过替换__import__
,或者使用导入系统提供的一个较少的大锤钩子来做到这一点,但它根本不值得,而且它不会去导致易于理解或推理的程序。