Почему ошибка отступа вызывает затенение из внешних областей

#python #scope

#python #область

Вопрос:

Я работаю над игрой под названием Scuba Adventure, и при попытке найти источник ошибки атрибута я получил другую ошибку, говорящую что-то вроде «тени объекта из внешней области». Я обнаружил, что источником ошибки является отступ. При определении класса с именем Bubble, который управлял объектом bubble и группой sprite, я случайно сделал отступ в методах внутри def __init__() . Мой класс был примерно таким:

 import pygame
from pygame.sprite import Sprite

class Bubble(Sprite):
    """A class that manages bubbles released from the diver."""

    def __init__(self, sa_game):
        """create a bubble object at the diver's current position."""
        super().__init__()
        """Some attributes"""
        "
        "

        # import the bubble image
        """Code to import the bubble image"""

        # Store the bubble's position as a decimal value
        """ """

        def update(self):
           """Move the bubble up the screen."""
           # Method to update the decimal position of the bubble
           

        def blit_bubble(self):
           """Method to draw the bubble at the diver's current location"""
  

Сами тела функций не имеют значения. Но мне интересно, что означает «затенение из внешней области» и почему ошибка отступа может вызвать это. Я все еще новичок, поэтому эта концепция может быть новой для меня

Ответ №1:

Это означает, что методы существовали в двух местах, и те, что внутри __init__ , переопределяли бы (shadow) любое определение, которое у них было за пределами этой области.

Комментарии:

1. Является ли это частью базового Python? Я предполагаю, что это из Pygame

2. Ах, вместо этого это похоже на линтинг, и я объединил «ошибку» с предупреждением. nm

3. Это из Pygame

4. @tripleee, итак, метод update (), который я получаю, что это приведет к затенению, потому что я использовал другие функции update () в других классах. Но blit_bubble() — это метод, уникальный для этого класса, отличный от вызова функции в основном цикле. Значит, в этом случае blit_bubble() также будет затенен?

5. Если нет другого определения, то технически нет, но статический анализатор кода может быть не в состоянии исключить возможность того, что существует другое определение, хотя он его не видит, или корректно, но слегка вводящее в заблуждение предупреждение о затенении неопределенной ссылки.