【发布时间】:2015-08-18 07:25:17
【问题描述】:
我正在修改一个简单的递归函数来使用turtle绘制一条龙曲线:
def draw_dragon(t, order, size, L=turtle.left, R=turtle.right):
""" Draw a dragon curve """
if not order:
t.forward(size)
return
size /= 1.41421
t.R(45)
draw_dragon(t, order-1, size, L, R)
t.L(90)
draw_dragon(t, order-1, size, R, L)
t.R(45)
if __name__=="__main__":
import turtle
wn = turtle.Screen()
fred=turtle.Turtle()
draw_dragon(fred,6,200)
wn.exitonclick()
由于我在函数定义的时候还没有导入turtle,解释器给了我"NameError: name 'turtle' is not defined"。
有没有办法在我的 draw_dragon 函数中仍然使用 turtle 模块的函数,而无需先将它们导入函数之外?
【问题讨论】:
-
这是什么原因?当您定义
draw_dragon时,您将turtle.left分配给Lkwarg;如果您不告诉解释器(通过import语句或定义),解释器怎么会知道您要分配给L的内容。解释器解析turtle.arg(它很聪明,可以通过.拆分违规值,从而告诉您第一个未找到的子模块是什么) -
“因为我在函数定义的时候还没有导入turtle”——好吧,为什么不呢?
-
“有没有办法”?可以说,有一些非常可怕的黑客。有没有一种好的方法,符合最佳实践,也不会破坏编辑器的代码分析?不。(为什么你想要一个,而不是仅仅将
import移动到文件的顶部?) -
我在想,万一你一开始就导入了命名空间,后来你可能会遇到命名空间冲突(你不能“取消导入”命名空间吗?)我还想Python 只是跳过函数定义,直到调用/执行函数时才需要命名空间......
-
实际上可以,但您不应使用与您正在使用的模块相同的名称。
标签: python function namespaces python-module