web-dev-qa-db-fra.com

Est-il possible uniquement de déclarer une variable sans affecter de valeur en Python?

Est-il possible de déclarer une variable en Python, comme ceci?

var

afin qu'il initialise à Aucun? Il semble que Python le permette, mais dès que vous y accédez, il se bloque. Est-ce possible? Sinon pourquoi?

EDIT: Je veux le faire pour des cas comme celui-ci:

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

Dupliquer

En relation

207
Joan Venge

Pourquoi ne pas simplement faire ceci:

var = None

Python est dynamique, vous n'avez donc pas besoin de déclarer des choses; ils existent automatiquement dans la première portée où ils sont attribués. Ainsi, tout ce dont vous avez besoin est une ancienne déclaration de mission régulière comme ci-dessus.

C'est bien, parce que vous ne finirez jamais avec une variable non initialisée. Mais faites attention - cela ne signifie pas que vous ne vous retrouverez pas avec les variables incorrectement initialisées. Si vous initiez quelque chose à None, assurez-vous que c'est ce que vous voulez vraiment et attribuez quelque chose de plus significatif si vous le pouvez.

275
Todd Gamblin

Je vous recommande vivement de lire Les autres langues ont des "variables" (je l'ai ajouté comme lien associé) - en deux minutes, vous saurez que Python a des "noms", pas "des variables".

val = None
# ...
if val is None:
   val = any_object
54
jfs

Je ne suis pas sûr de ce que vous essayez de faire. Python est un langage très dynamique. vous n'avez généralement pas besoin de déclarer des variables avant de les affecter ou de les utiliser. Je pense que ce que tu veux faire est juste

foo = None

qui assignera la valeur None à la variable foo.

EDIT: Ce que vous vraiment semble vouloir faire est juste ceci:

#note how I don't do *anything* with value here
#we can just start using it right inside the loop

for index in sequence:
   if conditionMet:
       value = index
       break

try:
    doSomething(value)
except NameError:
    print "Didn't find anything"

Il est un peu difficile de dire si c'est vraiment le bon style à utiliser à partir d'un exemple de code aussi court, mais c'est est une manière plus "pythonique" de travailler.

EDIT: ci-dessous est un commentaire de JFS (posté ici pour montrer le code)

Non lié à la question du PO mais le code ci-dessus peut être réécrit comme suit:

for item in sequence:
    if some_condition(item): 
       found = True
       break
else: # no break or len(sequence) == 0
    found = False

if found:
   do_something(item)

REMARQUE: si some_condition() lève une exception, alors found est non lié.
REMARQUE: si len (sequence) == 0 alors item est non lié.

Le code ci-dessus n'est pas conseillé. Son but est d'illustrer le fonctionnement des variables locales, à savoir si "variable" est "définie" ne peut être déterminée qu'au moment de l'exécution dans ce cas. Manière préférable:

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

Ou

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)
13
kquinn

Dans Python 3.6+, vous pouvez utiliser des annotations variables pour cela:

https://www.python.org/dev/peps/pep-0526/#abstract

Le PEP 484 a introduit des conseils de type, des annotations de type.k.a. Bien que son objectif principal soit les annotations de fonctions, il a également introduit la notion de commentaires de type pour annoter les variables:

# 'captain' is a string (Note: initial value is a problem)
captain = ...  # type: str

PEP 526 vise à ajouter une syntaxe à Python pour annoter les types de variables (y compris les variables de classe et les variables d'instance), au lieu de les exprimer à l'aide de commentaires:

captain: str  # Note: no initial value!

Cela semble correspondre plus directement à ce que vous demandiez: "Est-il possible uniquement de déclarer une variable sans affecter de valeur en Python?"

8
Tagar

J'initialise habituellement la variable à quelque chose qui dénote le type comme

var = ""

ou 

var = 0

S'il s'agit d'un objet, ne l'initialisez pas avant de l'instancier:

var = Var()
4
Andrew Hare

Eh bien, si vous voulez vérifier si une variable est définie ou non, pourquoi ne pas vérifier si elle se trouve dans les tableaux locals () ou globals ()? Votre code réécrit:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

Si vous recherchez une variable locale, remplacez globals () par locals (). 

3
Johan

Tout d'abord, ma réponse à la question que vous avez initialement posée

Q: Comment savoir si une variable est définie en un point de mon code?

A: Lire dans le fichier source jusqu'à ce que vous voyiez une ligne où cette variable est définie.

Mais plus loin, vous avez donné un exemple de code montrant qu'il existe diverses permutations qui sont plutôt pythoniques. Vous recherchez un moyen de rechercher dans une séquence des éléments correspondant à une condition, voici donc quelques solutions:

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

Clairement, dans cet exemple, vous pouvez remplacer la raise par un return None en fonction de vos objectifs.

Si vous voulez tout ce qui correspond à la condition, vous pouvez le faire:

def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

Il y a une autre façon de faire cela avec yield que je ne vais pas vous expliquer, parce que c'est très compliqué dans son fonctionnement.

En outre, il existe un moyen unique d’atteindre cet objectif:

all_matches = [value for value in sequence if matchCondition(value)]
2
Jerub

Si je comprends bien votre exemple, vous n'avez de toute façon pas besoin de faire référence à "valeur" dans l'instruction if Vous vous échappez dès que cela pourrait être réglé.

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
2
fholo

On dirait que vous essayez d'écrire C en Python. Si vous voulez trouver quelque chose dans une séquence, Python a des fonctions intégrées pour le faire, comme

value = sequence.index(blarg)
1
Ken

C'est une bonne question et, malheureusement, de mauvaises réponses car var = None attribue déjà une valeur et si votre script s'exécute plusieurs fois, il est écrasé par None à chaque fois. 

Ce n'est pas la même chose que définir sans cession. J'essaie toujours de trouver un moyen de contourner ce problème.

1
zinturis
var_str = str()
var_int = int()
0
Zaur

Vous pouvez tromper un interprète avec ce vilain oneliner if None: var = NoneIl ne fait rien d’ajouter à l’ajout d’une variable var au dictionnaire de variables locales sans l’initialiser. L'interprète lève l'exception UnboundLocalError si vous essayez d'utiliser cette variable dans une fonction par la suite. Cela fonctionnerait aussi pour les très anciennes versions de python. Pas simple, ni beau, mais n'attendez pas grand chose de python.

0
ZAB

Si None est une valeur de donnée valide, vous devez utiliser la variable d'une autre manière. Vous pouvez utiliser:

var = object()

Cette sentinelle est suggérée par Nick Coghlan .

0
Chris_Rands