不同模块的不同导入行为

时间:2017-05-15 17:54:56

标签: python import module

我有三个模块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)。

我的问题是这样的设计是否可行(例如,是否存在与上述名称的导入模块相同的功能)?

2 个答案:

答案 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__,或者使用导入系统提供的一个较少的大锤钩子来做到这一点,但它根本不值得,而且它不会去导致易于理解或推理的程序。