【问题标题】:Import all elements of particular type from module从模块中导入特定类型的所有元素
【发布时间】:2019-03-02 15:00:27
【问题描述】:

我想在模块中导入仅属于特定类型的对象。

例如要导入的模块是:

# foo.py

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

现在我想从foo(即a)导入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。他们只是通过其他地方的路径。

完全避免这种导入的替代设计是受欢迎的。

【问题讨论】:

  • Python 中没有这种类型的东西。并且有充分的理由。您尝试这样做的事实表明您的设计可能有问题(尽管由于信息有限,我不能说更多)

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


【解决方案1】:

如果你想这样做,只需将它放入一个函数本身并像这样调用它 (我认为这是你想要做的,如果不是,请纠正我)

def A():
    return(a)

def B():
    return(b)

然后在你的其他 python 文件中做

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

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

【讨论】:

  • 我知道这在某些情况下是如何工作的。不幸的是,它不适用于我的。我在问题的编辑版本中添加了更多信息。
猜你喜欢
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2022-01-05
  • 2018-12-02
相关资源
最近更新 更多