当使用"import module as name"时,如何从模块中获取"name"?

3

我似乎找不到模块绑定的实际名称存储在哪里。 例如:

import re as my_re

print my_re.__name__ # Output is "re," not "my_re"

我希望能够获取导入模块时使用的名称,而不是实际模块的名称。

我的使用情况是我有一个函数,它以函数对象作为参数,并需要确定绑定到哪个名称。以下是更详细的示例:

import module as my_module

def my_func(in_func):
    print in_func.__bound-name__ # Or something to this effect

my_func(my_module.function1) # Should print "my_module.function1"

当您运行“print my_re.__name__”时,您已经知道实际名称为my_re,因为这就是您调用命令的方式。 - Agile_Eagle
没错,但在我的情况下,我有一个以模块作为参数的函数,并且我需要动态确定导入该模块的名称。我应该在我的原始问题中更清楚地表达这一点。 - SnippedPaws
2个回答

1
我会将模块名作为字符串传递,并使用globals()获取该模块,以便在函数内部使用。假设您将'np'传递给函数,则globals()['np']将返回该函数。
In [22]: import numpy as np
In [23]: def demo(A):
    ...:     a = globals()[A]
    ...:     print(a.array([i for i in range(10)]))
    ...:

In [24]: demo('np')
[0 1 2 3 4 5 6 7 8 9]

如果你使用 import numpy as np; a = b = c = np 这样的代码,会有一个问题,但这并不是一个好主意。-- OP (原帖作者)很可能在寻找一些不太好的方法 ;) - anthony sottile
还好。使用globals()不是一个好主意。但这是我能想到的唯一解决方法。或者也许OP可以设置__repr__(我不确定)。 - Osman Mamun
这是一个有趣的选项,也不太远离我之前尝试过的东西。看起来应该有某个地方存储那个映射(实际模块名称和别名之间的映射)...这就是我真正希望找到的。 - SnippedPaws

1

由于字符串 my_re 并未存储在任何地方,仅是一个变量名,因此无法完全实现您想要的功能。PEP221 提出了 import ... as 语句的语法,解释以下行相等:

import re as my_re

并且

import re
my_re = re
del re

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接