gpt4 book ai didi

python - 试图理解 __init__.py 结合 getattr

转载 作者:行者123 更新时间:2023-12-03 09:26:49 26 4
gpt4 key购买 nike

我正在尝试理解一段 Python 代码。
首先,我有以下文件结构:

folder1--
model
__init__.py
file1.py
file2.py
__init__.py
__init__.py在文件夹folder1 中什么都没有。 __init__.py在文件夹模型中有以下内容:
import os
files = os.listdir(os.path.split(os.path.realpath(__file__))[0])
files.remove('__init__.py')
for file in files:
if file.endswith('.py'):
exec('from .{} import *'.format(file[:-3]))
话虽如此,我在python中有一些使用上述所有内容的代码
现在,我试图理解以下代码
from folder1 import model as mymodel
我的第一个问题是这是做什么的?我的意思是模型是一个文件夹名称,对吗?它不是一个对象。或者是吗?究竟是什么导入为 mymodel这里?
然后在它说的相同代码中
global args, cfg, is_fov120
args = parser.parse_args()
model = getattr(mymodel, args.arch)(sync_bn=False)
显然有一些参数叫做 arch .这里发生了什么, model 发生了什么?有这之后?
编辑
当我做 print(mymodel)我明白了 <module 'folder1.model' from 'C:\\path\\to\\folder1\\model\\__init__.py'>进一步调查我可以看到我已经从文件夹模型中的文件中导入了所有对象。 mymodel.files给出文件夹中的文件列表,我可以调用 mymodel.somevariable如果在 file1.py 或 file2.py 中定义了某个变量。至于类,我必须先创建一个对象,如 x=mymodel.aClass()然后我可以访问对象 x.someElement 的元素.
最后我发现 getattr正在从模型内部的文件中获取一个类,我可以猜到 sync_bn=False是该类的构造函数的参数。
所以最后,模型是那个类的对象。

最佳答案

如果您希望将文件夹作为 python 模块,该文件夹必须包含 __init__.py ,即使它是空的。然后你可以导入其余的。

import os
files = os.listdir(os.path.split(os.path.realpath(__file__))[0]) #get the folder's content
files.remove('__init__.py') #remove __init__.py since it is empty
for file in files: #loop through the files
if file.endswith('.py'): #if it is a python file
exec('from .{} import *'.format(file[:-3])) #import
上面的代码,每隔一个 .py 导入一次文件比 __init__ , 为空。
from folder1 import model as mymodel
这里 folder1是模块, model是您从(文件夹) model 导入的对象在这种情况下,因为它现在被导入到文件夹 1 的 __init__.py ,现在它是 folder1 的一部分(这是一个讨论的模块)。
model = getattr(mymodel, args.arch)(sync_bn=False)
此行等于: mymodel.attr , 其中 attr是对象的所需属性。您能否在 getattr 周围发布更多代码? ,因为我不知道是什么 args.arch指的是。
Pyzard建议, getattr method 得到一个属性,它是一个函数,因为它被调用了,method 是这个函数返回的值。在这种情况下 sync_bn无关紧要,但了解更多关于 args.arch仍然会有所帮助。

更多关于 getattr功能,如何 import作品。更好地解释 init.py works .

关于python - 试图理解 __init__.py 结合 getattr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63183234/

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