从模块导入特定类型的所有元素

时间:2018-09-26 18:57:04

标签: python types import python-import python-importlib

我想在模块中导入只有特定类型的对象。

例如,要导入的模块是:

# foo.py

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

现在我想从A(即foo)中导入类型为a的元素。

很显然,您可以导入所有foo,然后对其进行遍历以检查类型。不过,我认为那并不理想。

也许importlib中有什么可以帮助实现这一点?

编辑

(添加有关用例的更多信息。)

基本上,我正在尝试创建类似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 :(得分:-1)

如果要执行此操作,只需将其本身放入函数中,然后这样调用即可 (我认为这是您要尝试执行的操作,如果不行,请纠正我)

def A():
    return(a)

def B():
    return(b)

然后在其他python文件中做

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

foo显然是它的实际名称的占位符。