2011-05-29 4 views
50

Lorsque vous code dans d'autres langues, vous parfois créer un champ de blocs, comme ceci:portée de bloc en Python

statement 
... 
statement 
{ 
    statement 
    ... 
    statement 
} 
statement 
... 
statement 

L'un des objectifs (de beaucoup) est d'améliorer la lisibilité du code: montrer que certaines déclarations forment une unité logique ou que certaines variables locales sont utilisées uniquement dans ce bloc.

Existe-t-il une façon idiomatique de faire la même chose en Python?

+1

'Un but (parmi d'autres) est d'améliorer la lisibilité du code' - Code Python, écrit correctement (ie, en suivant le [zen of python] (http://www.python.org/dev/peps/pep-0020) /)) n'aurait pas besoin d'une telle garniture pour être lisible. En fait, c'est l'une des (nombreuses) choses que j'aime à propos de Python. –

+0

J'ai essayé de jouer avec l'instruction '__exit__' et' with', en changeant le 'globals()' mais j'ai échoué. –

+0

il serait très utile de définir une durée de vie variable, connectée à l'acquisition de ressources –

Répondre

50

Non, la création d'une portée de bloc n'est pas prise en charge par la langue. Les seuls moyens de créer une portée sont les fonctions, les classes ou les modules.

+0

@Alaya Oui, et plusieurs autres langues aussi. Mais la question concernait spécifiquement Python. – ThomasH

+0

Désolé, j'ai mal lu votre réponse comme "il n'y a pas de langue qui prend en charge la délimitation de bloc" ... – Alaya

+0

@Alaya, ouais peut-être supprimer votre commentaire? – JoelFan

30

La manière idiomatique en Python est de garder vos fonctions courtes. Si vous pensez en avoir besoin, refactorisez votre code! :)

Python crée une nouvelle portée pour chaque module, classe, fonction ou expression de générateur (en Python 3.x également pour les compréhensions de liste). En dehors de cela, il n'y a pas d'étendues imbriquées à l'intérieur des fonctions.

+3

"La chose la plus importante dans la programmation est la capacité de donner un nom à quelque chose, la deuxième chose la plus importante est de ne pas être obligé de donner un nom à quelque chose." Pour la plupart, Python nécessite que les étendues (pour les variables, etc.) soient nommées. À cet égard, Python variables le deuxième test le plus important. –

+5

Le plus important dans la programmation est la possibilité de gérer les dépendances de votre application et de gérer les étendues de blocs de code. Les blocs anonymes vous permettent de limiter la durée de vie des rappels, alors que vos callbacks ne sont utilisés qu'une seule fois, mais restent actifs pendant toute la durée du programme, ce qui provoque un encombrement global et nuit à la lisibilité du code. – Dmitry

2

Vous pouvez faire quelque chose de similaire à une portée de bloc C++ en Python en déclarant une fonction dans votre fonction, puis en l'appelant immédiatement. Par exemple:

def my_func(): 
    shared_variable = calculate_thing() 

    def do_first_thing(): 
     ... = shared_variable 
    do_first_thing() 

    def do_second_thing(): 
     foo(shared_variable) 
     ... 
    do_second_thing() 

Si vous ne savez pas pourquoi vous pouvez faire cela, alors this video pourrait vous convaincre.

Le principe de base est de tout contrôler aussi étroitement que possible sans introduire de «poubelle» (types/fonctions supplémentaires) dans une portée plus large que ce qui est absolument nécessaire - Rien d'autre ne veut utiliser la méthode do_first_thing() par exemple. t être étendu en dehors de la fonction d'appel.