一段代码中的问题 python getattr()
trouble in a piece of code python getattr()
我正在阅读一本书 Programming 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)
评论来自书中。最后一条评论说 "only have leftmost" 那么为什么 运行 如果我们想要循环
最左边 - 我们不能做 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()
方法returns对象的命名属性的值。如果没有找到,它将 returns 提供给函数的默认值。例如:
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')
当您展开它时,这当然正是循环所做的。
我正在阅读一本书 Programming 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)
评论来自书中。最后一条评论说 "only have leftmost" 那么为什么 运行 如果我们想要循环
最左边 - 我们不能做 path[-1]
吗?
假设您正在处理文件夹 /home/py_project/
如果您使用以下路径对模块(.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()
方法returns对象的命名属性的值。如果没有找到,它将 returns 提供给函数的默认值。例如:
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')
当您展开它时,这当然正是循环所做的。