Импортировать все элементы определенного типа из модуля - PullRequest
0 голосов
/ 26 сентября 2018

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

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

# foo.py

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

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

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

Возможно, в importlib есть что-то, что может облегчить это?

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

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

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

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

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

# 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.Они просто проходят путь где-то еще.

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

1 Ответ

0 голосов
/ 26 сентября 2018

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

def A():
    return(a)

def B():
    return(b)

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

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

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

...