python:除了命名空间冲突之外,包导入*是否有缺点

jus*_*ess 2 python import namespaces

我正在创建一个扩展包的类,在类实例化之前,我不知道我需要包的命名空间的哪个子集.我一直小心避免命名空间冲突我的代码,所以,不

from package import * 
Run Code Online (Sandbox Code Playgroud)

创建问题除了名称冲突?

是否更好地检查类的输入并仅导入我需要的名称(在运行时)__init__?

可以从set []导入python吗?

不

for name in [namespace,namespace]:
    from package import name
Run Code Online (Sandbox Code Playgroud)

有道理吗?

我希望这个问题看起来不像是不必要的手动铃声,我只是对python的新手,并且不想做每一个'开头的指南'说不做的一件事(来自pkg import*),除非我'我相信别无选择.

想法,建议欢迎.

Kar*_*tel 6

为了:

  • 它不会产生其他问题 - 但是,名称冲突可能比您预期的更具问题.

  • 如果可以的话,绝对推迟你的进口.即使Python变量范围很简单,如果不需要调用需要它的功能,您也可以获得不必导入模块的好处.

  • 我不知道你的意思.方括号用于制作列表,而不是集合.您可以在一行中从模块导入多个名称 - 只需使用逗号分隔的列表:

    from awesome_module import spam, ham, eggs, baked_beans
    # awesome_module defines lots of other names, but they aren't pulled in.
    
    Run Code Online (Sandbox Code Playgroud)
  • 不,这不会做你想要的 - name是一个标识符,因此,每次循环时,代码将尝试导入名称name,而不是与name变量引用的字符串对应的名称.

但是,你可以得到这样的"动态导入"的效果,使用__import__功能.有关详细信息,请参阅文档,并确保您有充分的理由首先使用它.我们在这里很快就进入了一些非常先进的语言用法,它通常不像它第一次出现那样必要.不要太聪明.我们讨厌他们狡猾的霍比特人.