【发布时间】:2013-10-15 09:03:30
【问题描述】:
我需要一个函数,它返回调用该函数的模块的包 的名称。获取模块名称很简单:
import inspect
module_name = inspect.currentframe().f_back.f_globals['__name__']
并且剥离最后一部分得到模块的包也很简单:
package_name = '.'.join(module_name.split('.')[:-1])
但如果函数是从包的__init__.py 调用的,则不应剥离名称的最后一部分。例如。如果从foo/bar/__init__.py调用,上例中的module_name会被设置为'foo.bar',这已经是包名了。
如何从模块名称或模块对象中检查它是指包还是模块?
我发现最好的方法是获取模块对象的__file__ 属性(如果存在),并检查它是否指向名称为__init__ 加上扩展名的文件。但这对我来说似乎很脆弱。
【问题讨论】: