Python PyCharm-来自海龟导入*--提供未使用的导入引用
PyCharm未正确导入/解析。代码运行正常,但没有完成代码,并标记为错误(红色的曲线) 演示这一点的代码如下所示:Python PyCharm-来自海龟导入*--提供未使用的导入引用,python,pycharm,python-import,turtle-graphics,Python,Pycharm,Python Import,Turtle Graphics,PyCharm未正确导入/解析。代码运行正常,但没有完成代码,并标记为错误(红色的曲线) 演示这一点的代码如下所示: from turtle import * forward(40) right(45) forward(80) import turtle t = turtle.Turtle() t.forward(40) t.right(45) t.forward(80) 以及一张用PyCharm展示问题的图片: 有人对如何解决这个问题有什么想法吗?无法从X导入Y使用,,非常烦人尝
from turtle import *
forward(40)
right(45)
forward(80)
import turtle
t = turtle.Turtle()
t.forward(40)
t.right(45)
t.forward(80)
以及一张用PyCharm展示问题的图片:
有人对如何解决这个问题有什么想法吗?无法从X导入Y使用,
,非常烦人尝试以下方法:
from turtle import Turtle
它必须起作用
问候。根据经验,不要使用来自X导入的
*
,无论X是什么软件包或其文档如何说明,它只会在以后的过程中导致错误
为什么应该避免“明星进口”
from turtle import *
def forward():
print('forward')
forward(45)
你认为会发生什么
turtle.forward
被本地定义的forward
函数覆盖,我们将得到一个错误TypeError:forward()接受0个位置参数,但给出了1个
为什么在这种情况下有效
from turtle import *
forward(40)
为了理解为什么Pycharm说没有定义forward
,上面的方法仍然有效,我们必须了解turtle
模块是如何实现的,然后理解Python导入是如何工作的,以及Pycharm是如何检查所用名称的“定义”的
乌龟
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'])
...
如您所见,它只需准备一些字符串列表(函数/类的名称),然后将所有内容合并到一个列表中,并将所有内容分配给\uuuuuuuuu
全局变量
关于\uuuuu all\uuuuuu
,我将不做太多的详细介绍(例如,因为在这个主题上有几个问答),但基本上它告诉解释器在从X导入*执行时应该使用哪些名称
当您从turtle import*
执行,然后使用forward
、right
等操作时,可以使用它们,因为它们的名称位于\uuuuuuuuuu all\uuuuuuu
中,但是Pycharm不知道它们会在运行时被\uuuuu all\uuuuuuu
公开,这里发生的事情是Python turtle与众不同,它有两个不同的接口,一个是功能接口,一个是面向对象的接口。如果使用面向对象的方法,一切都会正常工作:
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()
或:
但你不应该把两者混为一谈!因为这是海龟困惑的主要原因
PyCharm的问题在于,turtle函数API是在加载时从面向对象API派生的,因此PyCharm在扫描源文件时无法找到它。turtle方法都映射到默认的turtle,screen方法都映射到单个screen实例。不要使用来自X导入的*
,无论是什么包X
,或者它的文档中说了什么,它只会在以后导致bug。另外,Pycharm警告说,import-turtle
违反了PEP8,因为脚本顶部没有import
语句。我知道import-turtle
PEP8的事情,它只是为了证明它可以正常导入,所以可能不是解释器错误。。?不管怎样,这一点仍然存在。。。来自turtle import*
的应该可以工作,而转发(someInt)
的代码完成应该可以正常工作。。。相反,IDE警报会被抛出,即使Python运行得很好。。。我错过什么了吗?据我所知,只是PyCharm不喜欢它。它不。。。同样,代码按预期运行,但PyCharm不喜欢它。IDE失败,不是Python失败。谢谢你的建议,但我的问题更多的是,为什么IDE不一定能正确解释导入语句,或者看起来是这样。谢谢你对此稍作澄清。:)出于好奇,PyCharm检测到的方法实例化对象的唯一方法是什么(如我的示例的第二部分所述),还是我可以使用另一个更复杂的import语句?--[顺便说一句:我是Python的新手,但已经在Java、.Net和PHP领域工作了十多年]@Jack_Hu你可以从turtle import forward中执行,
,但是Pycharm仍然无法知道forward
的存在。最好的方法是实例化一个对象。这就是这些函数应该如何使用的。啊,对。我就是这么想的。无论如何,我不喜欢使用星号的整个想法。实例化对我来说要熟悉得多。谢谢你的帮助。:)
import turtle
turtle.forward(40)
turtle.right(45)
turtle.forward(80)
turtle.exitonclick()