Python:有没有办法在函数定义中使用“未导入”的对象?

时间:2015-06-03 21:25:07

标签: python function namespaces python-module

我正在修改一个简单的递归函数来使用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()

由于我在功能定义时还没有导入龟,解释器会给我"NameError: name 'turtle' is not defined"

有没有办法在我的draw_dragon函数中使用turtle模块的函数,而不先将它们导入函数外?

2 个答案:

答案 0 :(得分:2)

在定义函数之前是否有原因导致您没有导入? 我不确定为什么你需要将导入放在main函数中。

我不相信该函数有任何神奇的方法可以知道龟的模块是什么,除非它们是a)在命名空间中,或b)通过参数传递给函数。您可以将其放在主代码中:

if __name__=="__main__":
    import turtle
    wn = turtle.Screen()
    fred=turtle.Turtle()
    draw_dragon(fred,6,200,turtle.left, turtle.right)
    wn.exitonclick()          ^^^            ^^^

然后,将L和​​R更改为没有默认参数(它们将通过初始调用分配函数),因此您不会获得NameErrors。

您的函数现在应该知道这些方法是什么,因为您通过main将它们传递给函数。

你应该只是将导入调用移动到脚本的开头!

编辑:

你的代码仍然有一些奇怪的特质。而不是尝试将方法从导入的模块传递到您的函数中,只需使用属于您创建的龟对象的函数!这段代码应该有用,但它绝对不是你想要使用的常用做法......

def draw_dragon(t, order, size, right, left, forward):
    """ Draw a dragon curve """
    if order <= 0:
        forward(size)
        return

    size /= 1.41421
    right(45)
    draw_dragon(t, order-1, size, right, left, forward)
    left(90)
    draw_dragon(t, order-1, size, left, right, forward)
    right(45)

if __name__=="__main__":
    import turtle
    wn = turtle.Screen()
    fred=turtle.Turtle()
    draw_dragon(fred, 6,200, turtle.left, turtle.right, turtle.forward)
    wn.exitonclick()

更好的代码是:

from turtle import Screen, left, right, forward, speed, hideturtle

def draw_dragon(order, size, left, right):
    """ Draw a dragon curve """
    if order <= 0:
        forward(size)
        return
    size /= 1.41421
    right(45)
    draw_dragon(order-1, size, right, left)
    left(90)
    draw_dragon(order-1, size, left, right)
    right(45)

if __name__=="__main__":
    speed(0)
    hideturtle()
    wn = Screen()
    draw_dragon(8,200, left, right)
    wn.exitonclick()

答案 1 :(得分:-1)

我认为问题可能是因为你的turtle.py不在sys.path的目录下。