Comment le mauvais est l'occultation de noms définis dans des étendues extérieures?
Je viens de passé à Pycharm et je suis très heureux de tous les avertissements et les conseils qu'il me donne à améliorer mon code. Sauf pour ce qui, je ne comprends pas:
This inspection detects shadowing names defined in outer scopes.
Je sais que c'est une mauvaise pratique pour accéder à une variable à partir de l'extérieur de la portée, mais quel est le problème de l'ombrage à l'extérieur de la portée?
Ici est un exemple, où Pycharm me donne le message d'avertissement:
data = [4, 5, 6]
def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
print data
print_data(data)
- Aussi j'ai cherché la chaîne "Cette inspection détecte..." mais rien trouvé dans le pycharm l'aide en ligne: jetbrains.com/pycharm/webhelp/getting-help.html
- Pour désactiver ce message dans PyCharm: <Ctrl>+<Alt>+s (paramètres), Editeur, les Inspections, l'Occultation des noms à partir des étendues extérieures". Décochez la case.
Vous devez vous connecter pour publier un commentaire.
Pas grand-chose dans votre extrait ci-dessus, mais imaginez une fonction avec un peu plus d'arguments et tout à fait un peu plus de lignes de code. Ensuite, vous décidez de renommer vos
data
argument queyadda
, mais vous manquez l'un des endroits qu'il est utilisé dans la fonction du corps... Maintenantdata
se réfère à l'échelle mondiale, et vous commencez à avoir des comportements bizarres - où vous auriez beaucoup plus évidentNameError
si vous ne disposez pas d'un nom globaldata
.Rappelez-vous aussi qu'en Python, tout est objet (y compris les modules, les classes et les fonctions) donc il n'y a pas d'espaces de noms distincts pour les fonctions, de modules ou de classes. Un autre scénario est que vous importez de la fonction
foo
en haut de votre module, et de l'utiliser quelque part dans votre corps de la fonction. Ensuite, vous ajoutez un nouvel argument à votre fonction et l'a nommé - malchance -foo
.Enfin, fonctions et types de vivre dans le même espace de noms et peut-être l'ombre de la même façon.
N'est pas un problème, si vous avez à court fonctions, de la bonne dénomination et un décent unittest la couverture, mais bon, parfois, vous avez à maintenir moins que parfaite de code et d'être averti sur de telles questions pourraient aider.
Le moment le plus up-voté et accepté de répondre à et plus de réponses ici, à côté de la question.
Il n'a pas d'importance combien de temps votre fonction est, ou comment vous le nom de votre variable descriptive (l'espoir de minimiser les risques de collision de nom).
Le fait que votre fonction est une variable locale ou son paramètre arrive de partager un nom dans le domaine global est complètement hors de propos. Et en fait, peu importe le soin que vous choisissez, vous nom de variable locale, votre fonction ne peut jamais prévoir "si mon nom cool
yadda
sera également utilisé comme une variable globale dans l'avenir?". La solution? Simplement, ne vous inquiétez pas à ce sujet! Le bon état d'esprit pour la conception de votre fonction de consommer de l'entrée et des seuls à partir de ses paramètres dans la signature de, de cette façon, vous n'avez pas besoin de soins de ce qui est (ou sera) dans la portée globale, puis l'occultation n'est pas du tout un problème.En d'autres termes, la filature problème n'a d'importance que votre fonction doit utiliser le même nom de variable locale ET une variable globale. Mais vous devriez éviter de créer en premier lieu. L'OP du code n'a PAS vraiment d'avoir un tel problème de conception. C'est juste que PyCharm n'est pas assez intelligent et il donne un avertissement au cas où. Donc, juste pour faire de PyCharm heureux, et aussi de rendre notre code propre, voir cette solution citant silyevsk 's réponse pour supprimer la variable globale complètement.
Ce est la bonne façon de le "résoudre" ce problème, par fixation/retrait de votre global chose, ne pas ajuster votre actuelle fonction locale.
print_data
EST une variable globale. Pensez-y...Une bonne solution dans certains cas, peut-être pour déplacer le vars + code à une autre fonction:
Ce faire:
data
, tout au fond dans un délai de quelques centaines de lignes de code?data
est un nom local dans ce de la fonction, donc je n'ai même pas pris la peine de vérifier/se souvenir si un mondial du même nom existe, et encore moins ce qu'il contient.data
, il regarde à travers les étendues jusqu'à ce qu'il en trouve une, il t trouver le mondialdata
.data = [1, 2, 3]; def foo(): print(data); foo()
Cela dépend de combien de temps de la fonction. Le plus de la fonction, le plus de chance que quelqu'un vous de le modifier à l'avenir d'écrire
data
de penser que cela signifie que le mondial. En fait, cela signifie que le local, mais parce que la fonction est tellement longue qu'il n'est pas évident qu'il existe un local avec ce nom.Pour votre exemple de fonction, je pense que de l'ombre à la global n'est pas mal du tout.
Il ressemble à 100% pytest du modèle de code
voir:
https://docs.pytest.org/en/latest/fixture.html#conftest-py-sharing-fixture-functions
J'ai eu le même problème avec, c'est pourquoi j'ai trouvé ce post 😉
Et il avertit avec
This inspection detects shadowing names defined in outer scopes.
Pour corriger cela il suffit de déplacer votre
twitter
appareil dans./tests/conftest.py
Et supprimer
twitter
luminaire comme dans./tests/test_twitter2.py
Ce sera rendre heureux QA, Pycharm et tout le monde