PyCharm - from turtle import * -- 给出未使用的导入引用
PyCharm - from turtle import * -- Giving unused import reference
PyCharm 不正确 importing/resolving。代码运行正常,但未完成代码,并标记为错误(红色波浪线)。
演示代码如下:
from turtle import *
forward(40)
right(45)
forward(80)
import turtle
t = turtle.Turtle()
t.forward(40)
t.right(45)
t.forward(80)
以及演示 PyCharm 中问题的图片:
有没有人知道如何解决这个问题?无法使用 from X import Y
.
很烦人
试试这个:
from turtle import Turtle
一定有用。
你好。
根据经验,不要使用 from X import *
,无论 X 是什么包或它的文档怎么说,它只会在以后导致错误。
为什么要避免"star imports"
from turtle import *
def forward():
print('forward')
forward(45)
你认为会发生什么?
turtle.forward
被本地定义的forward
函数覆盖,我们会报错TypeError: forward() takes 0 positional arguments but 1 was given
为什么在这种情况下有效
from turtle import *
forward(40)
要理解为什么即使 Pycharm 说 forward
没有定义,上面的代码仍然有效,我们必须看看 turtle
模块是如何实现的,然后理解 Python 导入工作以及 Pycharm 如何检查 "definitions" 个已用名称。
turtle.py
tg_classes = ['ScrolledCanvas', 'TurtleScreen', 'Screen',
'RawTurtle', 'Turtle', 'RawPen', 'Pen', 'Shape', 'Vec2D']
_tg_screen_functions = ['addshape', 'bgcolor', 'bgpic', 'bye',
'clearscreen', 'colormode', 'delay', 'exitonclick', 'getcanvas',
'getshapes', 'listen', 'mainloop', 'mode', 'numinput',
'onkey', 'onkeypress', 'onkeyrelease', 'onscreenclick', 'ontimer',
'register_shape', 'resetscreen', 'screensize', 'setup',
'setworldcoordinates', 'textinput', 'title', 'tracer', 'turtles', 'update',
'window_height', 'window_width']
_tg_turtle_functions = ['back', 'backward', 'begin_fill', 'begin_poly', 'bk',
'circle', 'clear', 'clearstamp', 'clearstamps', 'clone', 'color',
'degrees', 'distance', 'dot', 'down', 'end_fill', 'end_poly', 'fd',
'fillcolor', 'filling', 'forward', 'get_poly', 'getpen', 'getscreen', 'get_shapepoly',
'getturtle', 'goto', 'heading', 'hideturtle', 'home', 'ht', 'isdown',
'isvisible', 'left', 'lt', 'onclick', 'ondrag', 'onrelease', 'pd',
'pen', 'pencolor', 'pendown', 'pensize', 'penup', 'pos', 'position',
'pu', 'radians', 'right', 'reset', 'resizemode', 'rt',
'seth', 'setheading', 'setpos', 'setposition', 'settiltangle',
'setundobuffer', 'setx', 'sety', 'shape', 'shapesize', 'shapetransform', 'shearfactor', 'showturtle',
'speed', 'st', 'stamp', 'tilt', 'tiltangle', 'towards',
'turtlesize', 'undo', 'undobufferentries', 'up', 'width',
'write', 'xcor', 'ycor']
_tg_utilities = ['write_docstringdict', 'done']
__all__ = (_tg_classes + _tg_screen_functions + _tg_turtle_functions +
_tg_utilities + ['Terminator'])
...
如您所见,它只是准备了一些字符串列表(它们是 functions/classes/etc 的 names)然后将所有内容连接到一个列表并将所有内容分配给__all__
全局变量。
我不会详细介绍 __all__
(因为有几个关于该主题的问答,例如 Can someone explain __all__ in Python?),但基本上它告诉解释器哪些名称应该可用当做 from X import *
.
当你做 from turtle import *
然后使用 forward
、right
等时,它们可以使用,因为它们的名字在 __all__
中,但是 Pycharm 不知道它们会在 运行时 .
被 __all__
暴露
这里发生的事情是 Python turtle 不寻常,因为它有两个不同的接口,一个 functional 和一个 object-oriented 一个。如果你使用面向对象的,一切都应该可以正常工作:
from turtle import Screen, Turtle
yertle = Turtle()
yertle.forward(40)
yertle.right(45)
yertle.forward(80)
screen = Screen()
screen.exitonclick()
功能界面让初学者更容易上手:
from turtle import *
forward(40)
right(45)
forward(80)
exitonclick()
或:
import turtle
turtle.forward(40)
turtle.right(45)
turtle.forward(80)
turtle.exitonclick()
但是你不应该把两者混为一谈!因为这是乌龟混淆的主要来源。
PyCharm 的问题是 turtle functional API 派生自 object-oriented API 在加载时,因此 PyCharm 在扫描源文件时找不到它。 turtle 方法全部映射到 default turtle,screen 方法全部映射到 singular screen 实例。
PyCharm 不正确 importing/resolving。代码运行正常,但未完成代码,并标记为错误(红色波浪线)。
演示代码如下:
from turtle import *
forward(40)
right(45)
forward(80)
import turtle
t = turtle.Turtle()
t.forward(40)
t.right(45)
t.forward(80)
以及演示 PyCharm 中问题的图片:
有没有人知道如何解决这个问题?无法使用 from X import Y
.
试试这个:
from turtle import Turtle
一定有用。
你好。
根据经验,不要使用 from X import *
,无论 X 是什么包或它的文档怎么说,它只会在以后导致错误。
为什么要避免"star imports"
from turtle import *
def forward():
print('forward')
forward(45)
你认为会发生什么?
turtle.forward
被本地定义的forward
函数覆盖,我们会报错TypeError: forward() takes 0 positional arguments but 1 was given
为什么在这种情况下有效
from turtle import *
forward(40)
要理解为什么即使 Pycharm 说 forward
没有定义,上面的代码仍然有效,我们必须看看 turtle
模块是如何实现的,然后理解 Python 导入工作以及 Pycharm 如何检查 "definitions" 个已用名称。
turtle.py
tg_classes = ['ScrolledCanvas', 'TurtleScreen', 'Screen',
'RawTurtle', 'Turtle', 'RawPen', 'Pen', 'Shape', 'Vec2D']
_tg_screen_functions = ['addshape', 'bgcolor', 'bgpic', 'bye',
'clearscreen', 'colormode', 'delay', 'exitonclick', 'getcanvas',
'getshapes', 'listen', 'mainloop', 'mode', 'numinput',
'onkey', 'onkeypress', 'onkeyrelease', 'onscreenclick', 'ontimer',
'register_shape', 'resetscreen', 'screensize', 'setup',
'setworldcoordinates', 'textinput', 'title', 'tracer', 'turtles', 'update',
'window_height', 'window_width']
_tg_turtle_functions = ['back', 'backward', 'begin_fill', 'begin_poly', 'bk',
'circle', 'clear', 'clearstamp', 'clearstamps', 'clone', 'color',
'degrees', 'distance', 'dot', 'down', 'end_fill', 'end_poly', 'fd',
'fillcolor', 'filling', 'forward', 'get_poly', 'getpen', 'getscreen', 'get_shapepoly',
'getturtle', 'goto', 'heading', 'hideturtle', 'home', 'ht', 'isdown',
'isvisible', 'left', 'lt', 'onclick', 'ondrag', 'onrelease', 'pd',
'pen', 'pencolor', 'pendown', 'pensize', 'penup', 'pos', 'position',
'pu', 'radians', 'right', 'reset', 'resizemode', 'rt',
'seth', 'setheading', 'setpos', 'setposition', 'settiltangle',
'setundobuffer', 'setx', 'sety', 'shape', 'shapesize', 'shapetransform', 'shearfactor', 'showturtle',
'speed', 'st', 'stamp', 'tilt', 'tiltangle', 'towards',
'turtlesize', 'undo', 'undobufferentries', 'up', 'width',
'write', 'xcor', 'ycor']
_tg_utilities = ['write_docstringdict', 'done']
__all__ = (_tg_classes + _tg_screen_functions + _tg_turtle_functions +
_tg_utilities + ['Terminator'])
...
如您所见,它只是准备了一些字符串列表(它们是 functions/classes/etc 的 names)然后将所有内容连接到一个列表并将所有内容分配给__all__
全局变量。
我不会详细介绍 __all__
(因为有几个关于该主题的问答,例如 Can someone explain __all__ in Python?),但基本上它告诉解释器哪些名称应该可用当做 from X import *
.
当你做 from turtle import *
然后使用 forward
、right
等时,它们可以使用,因为它们的名字在 __all__
中,但是 Pycharm 不知道它们会在 运行时 .
__all__
暴露
这里发生的事情是 Python turtle 不寻常,因为它有两个不同的接口,一个 functional 和一个 object-oriented 一个。如果你使用面向对象的,一切都应该可以正常工作:
from turtle import Screen, Turtle
yertle = Turtle()
yertle.forward(40)
yertle.right(45)
yertle.forward(80)
screen = Screen()
screen.exitonclick()
功能界面让初学者更容易上手:
from turtle import *
forward(40)
right(45)
forward(80)
exitonclick()
或:
import turtle
turtle.forward(40)
turtle.right(45)
turtle.forward(80)
turtle.exitonclick()
但是你不应该把两者混为一谈!因为这是乌龟混淆的主要来源。
PyCharm 的问题是 turtle functional API 派生自 object-oriented API 在加载时,因此 PyCharm 在扫描源文件时找不到它。 turtle 方法全部映射到 default turtle,screen 方法全部映射到 singular screen 实例。