Есть ли причина, по которой вы не импортируете до того, как функция определена?
Я не уверен, зачем вам сначала вводить импорт в основную функцию.
Я не верю, что существует какая-либо магическая возможность для функции знать, какие модули черепа, если они не являются а) в пространстве имен или 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.
Теперь ваша функция должна знать, что такое методы, поскольку вы передали их функции через главный.
Возможно, вам стоит просто переместить вызов импорта в начало скрипта!
EDIT:
Ваш код все еще имеет некоторые странные идеосинкразий. Вместо того, чтобы пытаться передать методы из импортированных модулей в ваши функции, просто используйте функции, которые являются частью созданного вами объекта черепахи! Этот код должен работать, но это ТОЧНО не обычная практика вы хотите использовать ...
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()
В чем причина этого? Когда вы определяете 'draw_dragon', вы назначаете' turtle.left' 'L' kwarg; как мог интерпретатор узнать, что вы пытаетесь присвоить 'L', если вы этого не скажете (посредством оператора' import' или _definition_). Интерпретатор разбирает 'turtle.arg' (и он достаточно умен, чтобы разделить значение оскорбления на' .' и тем самым сообщить вам, что такое первый _submodule_, который не был найден) – CristiFati
«Так как я еще не импортировал черепаху в то время определения функции "- ну почему бы и нет? – user2357112
«Есть ли способ»? Возможно, с некоторым ужасным хакером. Есть ли способ _good_, соответствующий передовым методам, который также не нарушит анализ кода редакторов? Нет. (И зачем вам это нужно, а не просто перемещать «import» в верхнюю часть файла?) –