Python 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使用,,非常烦人尝

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 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()