Python:如何导入一堆相似的名字?

时间:2012-02-22 12:25:19

标签: python import

我在文件foo.py中定义了一堆函数,每个函数的名称都是func_xxx。我只想导入那些函数,而不是foo.py中的其他函数。如何在不列出所有内容的情况下实现这一目标?

6 个答案:

答案 0 :(得分:3)

最简单的方法是在__all__内定义foo.py。你可以这样做。

__all__ = [f for f in globals().keys() if f.startswith('func_')]

如果您想使用__all__语法从foo导入,则定义from foo import *只会有帮助。需要注意的是,__all__需要在模块的 end 中定义,即在定义所有func_函数后

编辑:您无法执行__all__ = [f for f in globals() if f.startswith('func_')],因为它会引发在迭代期间globals()被更改的错误。

答案 1 :(得分:2)

您可以导入foo.py,然后使用func_* import foo for name,value in vars(foo).items(): if name.startswith('func_'): # do what you want with value 执行您想要的操作:

{{1}}

如果您需要将它们带入您的命名空间vars()可以帮助您,但我从未使用它,除非您真的需要它,否则我不会推荐它。

答案 2 :(得分:0)

没有简单的方法可以做from foo import func_*,唉。

您应该明确地通过名称导入它们,以使代码更清晰,更易读。

答案 3 :(得分:0)

如果所有这些func_xxx函数都相似并且属于一起,那么如何定义字典:

func = {'aaa': func_aaa,
        'bbb': func_bbb, …}

然后导入这个词典:

from foo import func

然后以这种方式打电话:

func['aaa'](…)

答案 4 :(得分:0)

您可以简单地执行以下操作:

globals(0.update (dict ((key, value) for key, value in __import__("foo").__dict__.items() if key.startswith("func__")     ) )   

虽然我不推荐它 - 但只使用几个“from foo import func _”语句是一种更易读的形式。

答案 5 :(得分:0)

我认为更加pythonic的方法是将foo转换为package,将bar_xxx移动到foo / bar.py并从函数名中删除'bar'前缀。

所以这个

from foo import bar_xxx
bar_xxx(...)

会变成这样:

from foo import bar
bar.xxx(...)