我承认我刚刚开始使用Python 3.3中的turtle
图形,并且在使用from turtle import *
开始的YouTube演示之后。这允许使用fd(100)这样的短命令来代替我经常看到的格式turtle.forward(100)
等。
我的问题是:
如果我不应该在一个帖子中提出多个问题,我会提前道歉,但它们彼此相关,这似乎是合乎逻辑的。
答案 0 :(得分:2)
通常,是的,您确实希望避免使用from module import *
形式。这样做是因为它打开了模块(一个普通的python文件),并且基本上接受了该文件中定义的每个函数,类等,并将其添加到您的命名空间。你是对的 - *
的意思是"一切都是"。
因此,如果我编写了一个名为foo.py
的模块,其中包含一个名为bar1
,bar2
等的函数,那么执行from foo import *
将允许我使用这些函数,就像我在当前文件中定义了它:
from foo import *
bar1()
bar2()
# etc
这很糟糕的主要原因是它需要未知数量的函数和类并将其转储到命名空间中。当您突然开始使用某个功能时,很难跟踪更大代码库中的内容。例如:
from a import *
from b import *
from c import *
# etc
example()
# Where did this come from? From module a, b, or c? What if both a and b define a
# function named 'example'?
您已经了解import module; module.function
表单,但第三种表单也很有用:
from turtle import fd, right, left # etc
right(90)
fd(100)
backwards(300) # throws an error!
forwards(300) # throws an error!
现在,我可以挑选我想要的功能,知道它们来自哪里,并避免污染我的命名空间。
但是,在你的情况下,我不会过分担心它。由于您正在尝试和学习如何使用海龟模块,我认为将重点放在那个方面而不是编写完美的惯用Python更为重要。
答案 1 :(得分:0)
使用from package import *
您只需导入由您导入的软件包定义的__init__.py
文件__all__
变量中可选定义的所有内容。 __all__
变量可能会被省略,这就是 read the details
我大部分时间都使用"导入包"只是为了避免污染命名空间。