【问题标题】:Is it possible to detect way of import of a module in python?是否可以在 python 中检测模块的导入方式?
【发布时间】:2014-07-30 21:15:33
【问题描述】:

假设您有模块 foo 包含变量 bar 和线程 baz 会自动更新 bar

from threading import Thread
import sys
bar = 0
class baz(Thread):
  def run(self):
    while True:
      setattr(sys.modules[__name__], 'bar', getattr(sys.modules[__name__], 'bar')+1);
baz().start()
#Note: Globals is intentionally not used instead of getattr and setattr

由于在 __main__ 中无法读取此线程的更新(因为在 __main__ 中从 foo 中的值创建了一个副本),是否有可能找出模块是否使用 from foo import * 导入或import foo,并根据结果,将setattr和getattr中的__name__自动更改为__main__? This topic's answer 提供了一种通过 __main__ 中的代码检测它的方法,但我希望模块自己检测它。这有可能吗?

【问题讨论】:

  • “当然,在__main__ 中从foo 中的值复制”是什么意思?事实并非如此。
  • @BrenBarn 如果通过from foo import * 导入模块,第一次从模块中读取变量时,它的值会直接复制到__main__ 中,从而更新为foo 中的值 won'在 __main__ 中不可见,我的主要问题是什么,因为这不能通过使用 global bar 和线程中的“正常”分配来解决......
  • 不复制该值。新的 name 绑定到相同的值。你可以在 StackOverflow 上找到很多关于这种差异的问题。如果您的模块要求其用户“观察”变量的更改,只需记录并告诉用户不要使用from foo import *(尽管这是一个脆弱的设计,最好避免使用)。无论如何,最好问一个关于你实际想要完成的问题,而不是你认为可以帮助你完成它的特定技术(因为它可能不会)。

标签: python import


【解决方案1】:

没有。一个原因是一个模块可以从很多地方多次导入。它可以在一个地方用import foo 导入,在另一个地方用from foo import * 导入。第二次导入时不会“发生”任何事情(将使用 sys.modules 中已导入的模块),因此您的模块无法检测到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 2011-12-06
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多