一般来说,在我的python代码中使用语句“from module import *”是不好的做法?

In general, is it a bad practice to use the statement “from module import *” in my python code?

本问题已经有最佳答案,请猛点这里访问。

一年前我参加了一个Python教程,我非常喜欢它,所以我想我会尝试将tkinter小部件融入其中,因为,嗯,gui。我看过的许多关于初学者tkinter的教程都是从以下代码行开始的:from tkinter import *有没有令人信服的理由?我是说,为什么(或不是)把所有东西都装上?


是的,这是一种非常糟糕的做法,原因有两个:

  • 代码可读性
  • 覆盖变量/函数等的风险
  • 对于点1:我们来看一个例子:

    1
    2
    3
    4
    5
    from module1 import *
    from module2 import *
    from module3 import *

    a = b + c - d

    在这里,当看到代码时,没有人会知道bcd实际上属于哪个模块。

    另一方面,如果你喜欢:

    1
    2
    3
    4
    5
    6
    #                   v  v  will know that these are from module1
    from module1 import b, c   # way 1
    import module2             # way 2

    a = b + c - module2.d
    #            ^ will know it is from module2

    它对你来说更干净,而且新加入你团队的人会有更好的想法。

    第二点:假设module1module2都有b的变量。当我这样做的时候:

    1
    2
    3
    4
    from module1 import *
    from module2 import *

    print b  # will print the value from module2

    这里,module1的值丢失。即使在module1中声明了b,并且我编写了希望我的代码使用module1.b的代码,也很难调试为什么代码不工作。

    如果您在不同的模块中有相同的变量,并且不想导入整个模块,您甚至可以这样做:

    1
    2
    from module1 import b as mod1b
    from module2 import b as mod2b