Python:如何导入一组相似的名称?

Python:如何导入一组相似的名称?,python,import,Python,Import,我在foo.py文件中定义了一系列函数,每个函数的名称类似于func_xxx。我只想导入那些函数,而不是foo.py中的其他内容。如果不将它们全部列出,我怎么能做到这一点呢?最简单的方法是在foo.py中定义“all”。你可以这样做 __all__ = [f for f in globals().keys() if f.startswith('func_')] 如果要使用from foo import*语法从foo导入,则定义_uALL__uu仅会有所帮助。需要注意的一点是,需要在模块末尾定义

我在foo.py文件中定义了一系列函数,每个函数的名称类似于func_xxx。我只想导入那些函数,而不是foo.py中的其他内容。如果不将它们全部列出,我怎么能做到这一点呢?

最简单的方法是在foo.py中定义“all”。你可以这样做

__all__ = [f for f in globals().keys() if f.startswith('func_')]
如果要使用from foo import*语法从foo导入,则定义_uALL__uu仅会有所帮助。需要注意的一点是,需要在模块末尾定义uuu all uuu,即在定义了所有func函数之后


编辑:您不能执行uuu all uuu=[f for f in globals if f.startswith'func_uu'],因为这将导致一个错误,即在迭代过程中更改全局变量。

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

__all__ = [f for f in globals().keys() if f.startswith('func_')]
如果要使用from foo import*语法从foo导入,则定义_uALL__uu仅会有所帮助。需要注意的一点是,需要在模块末尾定义uuu all uuu,即在定义了所有func函数之后


编辑:您不能执行uuu all uuu=[f for f in globals if f.startswith'func_uu'],因为它会引发一个错误,即在迭代过程中全局被更改。

没有简单的方法来执行from foo import funct.*


您应该显式地按名称导入它们,以使代码更清晰易读。

要从foo导入func_*


您应该显式地按名称导入它们,以使代码更清晰易读。

您可以导入foo.py,然后使用以下函数执行所需操作:


如果需要将它们引入名称空间,可能会对您有所帮助,但我从未使用过它,除非您确实需要它,否则我不会推荐它。

您可以导入foo.py,然后使用以下函数执行所需操作:

如果需要将它们引入名称空间,可能会对您有所帮助,但我从未使用过它,除非您确实需要它,否则我不会推荐使用它。

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

func = {'aaa': func_aaa,
        'bbb': func_bbb, …}
from foo import func
然后仅导入此词典:

func = {'aaa': func_aaa,
        'bbb': func_bbb, …}
from foo import func
然后这样称呼他们:

func['aaa'](…)
如果所有这些func_xxx函数都相似并且属于同一个函数,那么定义一个字典如何:

func = {'aaa': func_aaa,
        'bbb': func_bbb, …}
from foo import func
然后仅导入此词典:

func = {'aaa': func_aaa,
        'bbb': func_bbb, …}
from foo import func
然后这样称呼他们:

func['aaa'](…)

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

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

虽然我不推荐使用它,但只需使用几个from foo import func_uuu语句,这是一种更可读的形式。

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

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

虽然我不建议使用它,但只使用几个from foo import func_uu语句是一种更可读的形式。

我认为更具python风格的方法是将foo转换为package,将bar_xxx移动到foo/bar.py,并从函数名中删除“bar”前缀

那么这个

from foo import bar_xxx
bar_xxx(...)
将变成这样:

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

我认为更具python风格的方法是将foo转换为package,将bar_xxx移动到foo/bar.py,并从函数名中删除“bar”前缀

那么这个

from foo import bar_xxx
bar_xxx(...)
将变成这样:

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

如果他使用通配符机制,那不是只有导入才能完成吗?i、 e.“从foo导入”。如果方法列表发生变化怎么办?@synthezerpatel你说得对。这仅适用于from foo import*。因为他想导入所有以func_3;开头的函数,所以我假设他想直接将它们导入本地名称空间。因为即使他将foo中的其余变量定义为带有前导下划线的private,import foo仍然只导入所有变量,而且他仍然可以访问私有变量。@P.J.Hades我修复了一个错误并添加了一个警告。请看一下更新后的版本。如果他使用通配符机制,那不是只会导入吗?i、 e.“从foo导入”。如果方法列表发生变化怎么办?@synthezerpatel你说得对。这仅适用于from foo import*。因为他想导入所有以func_3;开头的函数,所以我假设他想直接将它们导入本地名称空间。因为即使他将foo中的其余变量定义为带有前导下划线的private,import foo仍然只导入所有变量,而且他仍然可以访问私有变量。@P.J.Hades我修复了一个错误并添加了一个警告。请看一下更新的版本。@Praveen:我认为vars才是OP真正想要的,因为如果他不知道func_*的全名,如果你不知道如何调用它们,在你的命名空间中使用它们有什么意义?[编辑:但似乎我错了:@Praveen:我认为vars才是OP真正想要的,因为如果他不知道函数的全名,如果你不知道如何调用它们,在你的命名空间中使用它们有什么意义?[编辑:但似乎我错了:]请修复您的python语法。func{'aaa'}只是一个语法错误。请修复您的python语法。func{'aaa'}只是一个语法错误