2017-07-20 41 views
6

Mam następujący kod Python:Cienie wbudowanej nazwy „funkcji” i „moduł” z pycharm

function = "Developer" 
module = "something" 
print(function + " on " + module) 

Z pycharm 2017, mam pęcherzyk, który mówi „Cienie wbudowany w nazwach«funkcji»/"module" z PyCharm ".

Jestem zaskoczony, ponieważ "funkcja" i "moduł" nie są wbudowanymi nazwami. Nie są to również słowa kluczowe:

import __builtin__ 
import keyword 

assert "function" not in dir(__builtin__) # -> OK 
assert "module" not in dir(__builtin__) # -> OK 
assert "function" not in keyword.kwlist # -> OK 
assert "module" not in keyword.kwlist  # -> OK 

Co jest nie tak?

Używam CPython 2.7, ale mam taki sam problem z 3.5 & 3.6.

EDIT:

__builtin__ jest teraz builtins w Pythonie 3.

Odpowiedz

7

function jest "zdefiniowana" w builtins.pyi:

class function: 
    # TODO not defined in builtins! 
    __name__ = ... # type: str 
    __qualname__ = ... # type: str 
    __module__ = ... # type: str 
    __code__ = ... # type: Any 
    __annotations__ = ... # type: Dict[str, Any] 

Pamiętaj użyłem "zdefiniowane" vs zdefiniowane. Sprawdź ten absurd:

foo = function 

podnosi

Traceback (most recent call last): 
    File "main.py", line 117, in <module> 
    foo = function 
NameError: name 'function' is not defined 

Jednak jeśli nie function = 'a' IDE będzie narzekać (jak zauważyłem), że to cienie wbudowany w nazwie (choć function jest wyraźnie nie faktycznie zdefiniowano).

Dokładne zachowanie powtarza się z module.

Dzieje się tak, ponieważ (o ile rozumiem, każdy powinien poprawić mnie, jeśli się mylę) pliki pyi są tam tylko w celu podania wskazówek dotyczących typów (jako PEP-484 suggests).

Tak więc, nie jestem pewien, czy to ostrzeżenie jest błędem w linijce Pycharma (być może nie powinno to wyglądać na "definicje" w plikach .pyi) lub zamierzonym zachowaniem.

Tak czy inaczej, moduł i funkcja prawdopodobnie nie są dobre nazwy zmiennych w każdym razie.

+0

Nadal nie rozumiem, dlaczego "funkcja" istnieje w kracie PyCharm ... –

+0

@LaurentLAPORTE Że będziesz musiał zapytać JetBrains, ale jak wyjaśniłem w mojej odpowiedzi, najprawdopodobniej jest jakoś pomóc z podpowiedziami typu. – DeepSpace

+0

Znalazłem odniesienie do [Typeshed] (https://github.com/python/typeshed/) na GitHub. Cytat: "Każdy moduł Pythona jest reprezentowany przez skrót" .pyi ". Jest to normalny plik Pythona (tzn. Może być interpretowany przez Python 3), ale wszystkie metody są puste. Adnotacje funkcji Pythona ([PEP 3107] (https://www.python.org/dev/peps/pep-3107/)) są używane do opisu typów funkcji." –

1

Na PY-8672, od marca 2014 r. Istnieje możliwość zignorowania niektórych nazw podczas tej kontroli. Otwórz Ustawienia, wyszukaj "Wbudowane zacienienie", kliknij nazwę inspekcji i użyj sekcji Opcje, aby dodać nazwy, które inspekcja powinna zostać dodana do białej listy.