一段代码 Python getattr() 中的麻烦



我正在读一本书编程 Python(第 4 版(,我遇到了一段代码的问题,包括getattr.这是一个用于查找图标文件的循环,但我无法确定它在哪里搜索(以什么顺序(。我有使用getattr的基本知识,比如它在__dict__中搜索名称,但无法弄清楚这个。

mymod = __import__(__name__)           # import self for dir
path = __name__.split('.')             # poss a package path
for mod in path[1:]:                   # follow path to end
mymod = getattr(mymod, mod)        # only have leftmost
mydir = os.path.dirname(mymod.__file__)
myicon = os.path.join(mydir, self.iconmine)

评论来自书中。最后一条评论说"只有最左边的",所以如果我们愿意,为什么要运行循环 最左边的 - 我们不能做path[-1]吗?

假设您正在处理文件夹/home/py_project/中的 python 项目

如果要使用以下路径对模块(.py文件(进行编码:/home/py_project/modules/my_file.py模块在/home/py_project/modules/__init__.py中定义

然后

mymod = __import__(__name__) #  import self for dir
print(mymod)

产量:<module 'modules' from '/home/py_project/modules/__init__.py'>

path = __name__.split('.')
print(path)

产量:['modules', 'my_file']

for mod in path[1:]正在对上一个列表进行切片,并获取从 1 到 inf 的所有项目,在这种情况下,只考虑"my_file"。

for mod in path[1:]: #  follow path to end
mymod = getattr(mymod, mod) #  only have leftmost
# same as mymod = modules.my_file

mydir = os.path.dirname(mymod.__file__)
print(mydir)

产量:/home/py_project/modules

myicon = os.path.join(mydir, self.iconmine)
print(myicon)

产量:/home/py_project/modules/path_to_self.iconmine # I don't know what self.iconmine is, you didn't mention it.

始终打印(或调试(理解代码的步骤。

getattr((

getattr()方法返回对象的命名属性的值。如果未找到,则返回提供给函数的默认值。例如:

getattr(( 方法的语法是:

getattr(object, name[, default])

上述语法等效于:

object.name

例:

class Person:
name = "Louis"
person = Person()
print('Name:', person.name)
print('Name:', getattr(person, "name")) # using getattr() is the same as person.name

for循环的目的是从包传递getattr到最终模块。你不能简单地getattr('foo.bar.baz.quux'),你必须做

mymod = __import__('foo')
mymod = getattr(mymod, 'bar')
mymod = getattr(mymod, 'baz')
mymod = getattr(mymod, 'quux')

当然,这正是循环在展开时所做的。

最新更新