проблема в куске кода python getattr () - PullRequest
0 голосов
/ 10 января 2020

Я читал книгу Программирование Python (4-е издание), и у меня возникла проблема с фрагментом кода, включающим getattr. Это всего лишь oop для поиска файла иконки, но я не могу понять, где он ищет (в каком порядке). У меня есть базовые c знания об использовании 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)

Комментарии взяты из книги. В последнем комментарии говорится «только крайний левый», так зачем запускать l oop, если мы хотим крайний левый, - разве мы не можем вместо этого сделать path[-1]?

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Цель for l oop - транзитивно getattr от пакета до конечного модуля. Вы не можете просто getattr('foo.bar.baz.quux'), вам нужно сделать

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

, что, конечно, в точности то, что делает l oop при его развертывании.

0 голосов
/ 10 января 2020

Предположим, вы работаете над проектом python в папке /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() возвращает значение именованного атрибута объект. Если не найден, он возвращает значение по умолчанию, предоставленное функции. Например:

Синтаксис метода 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
...