gpt4 book ai didi

python - 区分模块和包

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:53 24 4
gpt4 key购买 nike

我需要一个函数,该函数返回调用该函数的模块的 的名称。获取模块名称很容易:

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__ 加上扩展名的文件。但这对我来说似乎很脆弱。

最佳答案

来自模块对象:

module.__package__

可用于我看过的一对,看起来是正确的。它可能不会给你你想要的东西:

import os.path
import httplib2
import xml.etree.ElementTree as etree

os.path.__package__
<blank... this is a builtin>
httplib2.__package__
'httplib2'
etree.__package__
'xml.etree'

你可以使用

function.__module__

同样,但这会为您提供模块名称,而不是实际模块 - 不确定是否有比再次导入局部变量更简单的方法来获取模块对象本身。

etree.parse.__module__
'xml.etree.ElementTree'

os.path.split.__module__
'ntpath'

好处是这看起来更正确,遵循事物的实际位置,例如:

httplib2.Response.__module__
'httplib2'
httplib2.copy.copy.__module__
'copy'
httplib2.urlparse.ParseResult.__module__
'urlparse'

等等

关于python - 区分模块和包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19247726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com