PyCharm - от импорта черепахи * - Предоставление неиспользованной ссылки на импорт - PullRequest
0 голосов
/ 29 апреля 2019

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:

https://prnt.sc/ni9dvk

У кого-нибудь есть идеи, как решить эту проблему?Довольно раздражает, что я не могу использовать from X import Y.

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Как правило, не используйте from X import *, независимо от того, что представляет собой пакет X или что написано в его документации. Это приведет только к ошибкам в будущем.

Почему "импорт звезд "следует избегать

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 проверяет «определения»"используемых имен.

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'])  

...

Как вы можете видеть, он просто подготавливает некоторые списки строк (которые являются имен функций / классов /и т. д.) затем объединяет все в один список и назначает все для глобальной переменной __all__.

Я не буду вдаваться в подробности о __all__ (так как в этой теме есть несколько вопросов и ответов по SO, дляпример Может ли кто-нибудь объяснить __all__ в Python? ), но в основном он сообщает интерпретатору, какие имена должны быть доступны при выполнении from X import *.

Когда вы делаете from turtle import *, а затем используете forward, right и т. Д., Ониони доступны для использования, поскольку их имя находится внутри __all__, но Pycharm не подозревает, что они будут выставлены __all__ при времени выполнения .

0 голосов
/ 29 апреля 2019

Здесь происходит то, что черепаха Python необычна тем, что имеет два различных интерфейса: функциональный один и объектно-ориентированный один. Если вы используете объектно-ориентированный, все должно работать нормально:

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 заключается в том, что функциональный API-интерфейс turtle *1016* является производным от объектно-ориентированного API во время загрузки, поэтому PyCharm не может найти его при сканировании исходного кода. файл. Все методы черепахи отображаются на по умолчанию черепаха, а методы экрана - на экземпляр экрана единственного числа .

0 голосов
/ 29 апреля 2019

Попробуйте:

from turtle import Turtle

должно работать.

привет.

...