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
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.
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
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)
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)
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?"
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()
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 ().
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)]
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
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)
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.
var_str = str()
var_int = int()
Vous pouvez tromper un interprète avec ce vilain oneliner if None: var = None
Il 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.
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 .