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