Что лучше в этом случае мерзости одного лайнера, и почему?

Эти две функции, кажется, делают одно и то же, так какой смысл использовать getattr?

getattr(__import__("os"), "chdir")("/content/")
__import__("os").__dict__["chdir"]("/content/")

2 ответа

getattr а также __dict__ полезны только тогда, когда вам нужно получить значение атрибута, имя которого вы можете получить только во время выполнения. Поскольку в этом случае вы уже знаете, что вы хотите фиксированный атрибут chdirнет смысла использовать getattr или доступ к __dict__ приписывать. Вместо этого вы можете просто сделать:

__import__('os').chdir("/content/")

Но опять же, поскольку модуль, который вы импортируете, тоже исправлен, вам следует придерживаться нормального использования import:

import os
os.chdir("/content/")

Игнорируя злобность их обоих, они семантически отличаются в Python 3.7.

  • __import__(some_mdl).__dict__[name] найду name если он был явно определен / назначен в модуле;

  • getattr(__import__(some_mdl), name) найду name если он был явно определен / назначен в модуле, а если нет, то вызовите some_mdl.__getattr__(name) если some_mdl.__getattr__ определяется.

Другие вопросы по тегам