web-dev-qa-db-fra.com

Souligner _ comme nom de variable dans Python

Peter Norvig a un essai décrivant un programme pour résoudre des puzzles sudok , même les plus difficiles, en combinant des opérations logiques déterministes et une traversée intelligente des solutions possibles. Ce dernier se fait récursivement; voici cette fonction ( source ):

def search(values):
    "Using depth-first search and propagation, try all possible values."
    if values is False:
        return False ## Failed earlier
    if all( len( values[s]) == 1 for s in squares): 
        return values ## Solved!
    ## Chose the unfilled square s with the fewest possibilities
    _,s = min( (len( values[s]), s) 
                for s in squares 
                if len(values[s]) > 1
            )
    return some( search( assign( values.copy(), s, d)) 
                for d in values[s]
            )

(J'ai ajouté des espaces, des CR et des tabulations pour le plaisir de mes yeux; excuses au Dr Norvig.)

Juste en dessous du commentaire, il y a une ligne commençant par "_,s". Cela semble être le Tuple décompressé (len(values[s]),s) avec la valeur minimale de s. Le Dr Norvig utilise-t-il "_" Comme nom de variable juste pour indiquer qu'il s'agit d'un résultat "peu importe", ou quelque chose d'autre se passe-t-il? Y a-t-il des moments où "_" Est recommandé comme nom de variable? En mode interactif, "_" Contient la réponse de l'opération précédente; existe-t-il une fonction similaire dans le code non interactif?

Mise à jour

Merci pour les bonnes réponses. Je suppose que la réponse va à Alex Martelli pour la "valeur ajoutée"; il souligne que l'idiome "_, vbl_of_interest" est souvent un effet secondaire de l'idiome DSU, lui-même rendu largement inutile).

64
behindthefall

Oui, _ est un nom traditionnel pour "je m'en fiche" (qui heurte malheureusement son utilisation dans I18N, mais c'est un problème distinct ;-). BTW, dans le Python d'aujourd'hui, au lieu de:

_,s = min( (len( values[s]), s) 
            for s in squares 
            if len(values[s]) > 1
        )

vous pourriez coder

s = min((s for s in squares if len(values[s])>1), 
        key=lambda s: len(values[s]))

(je ne sais pas pour quelle version de Python Peter écrivait, mais l'idiome qu'il utilise est un exemple de "décorer-trier-décorer" [[DSU]] sauf avec min au lieu de trier, et dans le Python le key= le paramètre facultatif est généralement le meilleur moyen de faire le DSU ;-).

69
Alex Martelli

Vous avez raison. En mode non interactif _ n'a pas de signification particulière. En effet, Norvig veut juste dire qu'il ne se soucie pas de la valeur de cette variable.

Hors sujet: cet article de Norvig est très sympa. Une lecture recommandée.

9
Stephan202

Votre interprétation est correcte. En dehors de la signification spéciale en mode interactif _ est juste utilisé comme un nom de variable "ne se soucie pas", en particulier lors du déballage.

9
mikej