Импортировать все элементы определенного типа из модуля

Я хочу импортировать в модуль объекты только определенных типов.

Например, импортируемый модуль:

# foo.py

a = A() # type(a) = A
b = B() # type(b) = B

Теперь я хочу импортировать элементы типа A из foo (т.е. a).

Очевидно, вы можете импортировать все foo, а затем просмотреть их, чтобы проверить типы. Хотя я не думаю, что это идеально.

Возможно, в importlib есть что-то, что может этому способствовать?

Редактировать

(Добавление дополнительной информации о варианте использования.)

По сути, я пытаюсь создать что-то вроде магии IPython и хочу создать объект для пользовательской магии.

Пользователь будет регистрировать функции в файле с помощью декоратора, который будет возвращать экземпляр определенного типа.

Затем пользователь передаст путь к модулю при создании экземпляра.

# user_file.py

# decorator returns object of particular type (e.g. `foo`)
@register
def a():
  ...

def b():
  ...

Затем происходит что-то вроде этого:

# importing_file.py

class GetsRegisteredKeys:

  def __init__(self, paths:list):
    for path in paths:
      # import the elements that were registered, i.e. that have `foo` type.

grk = GetsRegisteredKeys(paths=['./user_file.py'])

На самом деле пользователь не будет вызывать GetsRegisteredKeys. Они просто проходят по пути где-то еще.

Приветствуются альтернативные конструкции, полностью избегающие такого рода импорта.


person webelo    schedule 26.09.2018    source источник
comment
Ничего подобного в Питоне нет. И по уважительной причине. Тот факт, что вы пытаетесь это сделать, говорит о том, что, вероятно, что-то не так с вашим дизайном (хотя я не могу сказать об этом больше из-за ограниченности информации).   -  person zvone    schedule 26.09.2018


Ответы (1)


Если вы хотите сделать это, просто поместите это в функцию и назовите ее так (я думаю, это то, что вы пытаетесь сделать, поправьте меня, если это не так)

def A():
    return(a)

def B():
    return(b)

Затем в другом файле Python выполните

import foo
a = foo.A()
b = foo.B()

foo, очевидно, является заполнителем для его фактического имени.

person Tylerr    schedule 26.09.2018
comment
Я вижу, как это может работать в некоторых случаях. К сожалению, в моем случае это не сработает. Я добавил дополнительную информацию в отредактированную версию вопроса. - person webelo; 26.09.2018