Как вызвать функцию программно в Python, указав также программный модуль? - PullRequest
0 голосов
/ 12 декабря 2018

Я не могу использовать это

import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()

, потому что имя модуля жестко закодировано, и я не могу использовать это

module = __import__('foo')
func = getattr(module, 'bar')
func()

, потому что модуль является вложенным.

Я попробовал это

customer = 'jci'
module = __import__('customer.{customer_name}.gt'.format(customer_name=customer_name)) # AttributeError: module 'customer' has no attribute 'get_gt'
#module = __import__('customer.{customer_name}'.format(customer_name=customer_name), fromlist=['gt']) # AttributeError: module 'customer.jci' has no attribute 'get_gt'
#module = __import__('customer.{customer_name}.gt'.format(customer_name=customer_name), fromlist=[]) # AttributeError: module 'customer' has no attribute 'get_gt'
func = getattr(module, 'get_gt')
gt = func()    

, но потерпел неудачу с ошибками, указанными в комментарии вместе с каждым вариантом.

get_gt() - это функция внутри gt.py файла внутри каталога customer/jci.Внутри каждого каталога есть __init__.py.

Работает следующий жестко закодированный код:

import customer.jci.gt as g
gt = g.get_gt()

Как преодолеть?

1 Ответ

0 голосов
/ 12 декабря 2018

То, что вы хотите, это importlib.import_module.


Обратите внимание, что __import__ обрабатывает точечные имена, но возвращает родитель пакет, а не последний потомок.

Доказательство:

>>> http = __import__('http.client')
>>> http.client   # the client submodule was imported
<module 'http.client' from '/usr/lib/python3.6/http/client.py'>
>>> # without specifying the .client in the name the submodule is not imported
>>> __import__('http').client
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'http' has no attribute 'client'

import_module вместо этого возвращает дочерний модуль, чего большинство людей ожидают:

>>> importlib.import_module('http.client')
<module 'http.client' from '/usr/lib/python3.6/http/client.py'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...