Форум сайта python.su
Доброго времени суток уважаемый All.
Столкнулся с парой задачек-неберучек.
1.
Дано:
переменная = ‘название_модуля’
Вопрос:
Как импортировать модуль, через переменную
Решение:
regall2.>>> x = 'sys'
>>> sys = __import__(x)
>>> sys
ZZZАльтернативное решение:>>> x, y, z = 'csv', 'excel', '__doc__'
>>> module = __import__(x)
>>> func = getattr(module, y) # Для получения csv.excel
>>> mean = getattr(func, z) # Для получения csv.excel.__doc__
regallБлагодарю за дельные и внятные ответы.>>> per1 = 'math'
>>> module = __import__(per1)
>>> per2 = 'log10'
>>> module.__dict__[per2](10)
Отредактировано (Ноя. 17, 2009 21:11:01)
Офлайн
Hat
Как импортировать модуль, через переменную
>>> x= 'sys'
>>> x = 'sys'
>>> sys = __import__(x)
>>> sys
<module 'sys' (built-in)>
Офлайн
Hat
Как получить результат модуль.функция через переменные пер1 и пер2
>>> per1 = 'math'
>>> module = __import__(per1)
>>> per2 = 'log10'
>>> module.__dict__[per2](10)
1.0
Офлайн
regallПравильным решением будет использовать функцию getattr.
>>> module.__dict__(10)
Офлайн
ZZZ - почему?
Офлайн
Скажем так… Это расово верный способ получения аттрибута у объекта.
И если для модуля способ с __dict__ работает нормально, то для сложных объектов может не работать или работать не корректно. Да и модуль может быть подменён другим объектом в sys.modules.
Офлайн
regallЖаль что не работает такой код:>>> x= 'sys'
>>> x = 'sys'
>>> sys = __import__(x)
>>> sys
<module 'sys' (built-in)>
>>> x = 'sys'
>>> sys = 'import ' + x
>>> sys
Офлайн
HatИзучайте пока язык – потом смеяться над этой фразой будите.
Жаль что не работает такой код
Hat
но пожалуйста, приводите пример кошерного по вашему мнению кода
>>> getattr(__import__('sys'), 'argv')
['/Library/Frameworks/Python.framework/Versions/2.6/bin/bpython']
>>> import sys
>>> sys.argv
['/Library/Frameworks/Python.framework/Versions/2.6/bin/bpython']
>>> import this
>>> help(getattr)
Офлайн
HatДа, именно для новичков, но не для младенцев =)
Здесь же подфорум для новичков :-)
Офлайн
regallНу уж потерпите чутка :D
Да, именно для новичков, но не для младенцев =)
Офлайн