2017-07-14 1 views
1

Je lis que firstline de python en utilisant:Portée de la variable dans "avec" déclaration?

with open(file_path, 'r') as f: 
    my_count = f.readline() 
print(my_count) 

Je suis peu confus sur la portée de my_count variable. Bien que des impressions fonctionnent très bien, serait-il préférable de faire quelque chose comme my_count = 0 extérieur avec déclaration préalable (par exemple en C utilisé pour faire int my_count = 0)

+0

Je ne vois pas 'logs_count' dans le code fourni. Voulez-vous dire 'my_count'? – DeepSpace

+0

ce code est correct, pas besoin d'initialiser 'my_count' en dehors de la boucle en python –

Répondre

5

Une déclaration with ne crée pas un champ (comme if, for et while ne crée pas de portée non plus). En conséquence, Python va analyser le code et voir que vous avez fait une affectation dans l'instruction with, et ainsi rendre la variable locale (à la portée réelle).

Dans les variables Python ne ont pas besoin initialisation dans tous les chemins de code: en tant que programmeur, vous êtes responsable de vous assurer qu'une variable est affectée avant qu'il ne soit utilisé. Cela peut entraîner un code plus court: disons par exemple que vous savez avec certitude qu'une liste contient au moins un élément, alors vous pouvez l'assigner dans une boucle for. En Java, l'affectation dans une boucle for n'est pas considérée comme sûre (puisqu'il est possible que le corps de la boucle ne soit jamais exécuté).

Initialisation avant la with portée peut être plus sûr dans le sens que, après la déclaration with on peut supposer sans risque que la variable existe. Si d'autre part la variable doit être affectée dans l'instruction with, ne pas l'initialiser avant que l'instruction with entraîne réellement une vérification supplémentaire: Python va erreur si l'attribution a été ignorée dans l'instruction with.

Une instruction with est uniquement utilisée à des fins de gestion de contexte. Il force (par syntaxe) que le contexte que vous ouvrez dans le with soit fermé à la fin de l'indentation.

+0

Alors ai-je besoin d'initialisation? Ou je peux utiliser la variable my_count en dehors de l'instruction with comme je le fais. Quelle serait la meilleure pratique? – crystal

+0

@crystal: J'ai mis à jour la réponse avec plus d'informations à ce sujet. Est-ce que cela répond à votre question? –

+0

Merci pour l'explication: D – crystal

1

Vous devriez également passer par PEP-343 et Python Documentation. Il va effacer que ce n'est pas sur la création de la portée de son utilisation de Context Manager. Je cite la documentation python sur le gestionnaire de contexte

Un gestionnaire de contexte est un objet qui définit le contexte d'exécution à établir lors de l'exécution d'une instruction with. Le gestionnaire de contexte gère l'entrée et la sortie du contexte d'exécution souhaité pour l'exécution du bloc de code. Les gestionnaires de contexte sont normalement appelés en utilisant l'instruction with (décrite dans la section L'instruction with), mais peuvent également être utilisés en invoquant directement leurs méthodes.

utilisations typiques des gestionnaires de contexte comprennent sauvegarde et la restauration de divers types d'état global, le verrouillage et le déverrouillage des ressources, la fermeture a ouvert des fichiers, etc.