Python: 有没有办法在函数定义中使用 "unimported" 对象?

Python: is there a way to use "unimported" objects in function definitions?

我正在修改一个简单的递归函数以使用海龟绘制一条龙曲线:

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 模块的函数,而无需先将它们导入函数外?

有没有在定义函数之前不导入的原因?
我不确定为什么您需要首先将导入放在主要功能中。

我不相信有什么神奇的方法可以让函数知道 turtle 的模块是什么,除非它们 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()

我认为问题可能是由于您的 turtle.py 不在 sys.path 中的目录。