Comment passer un paramètre vide pour une fonction python?
Voici le code de travail:
def g(y=10):
return y**2
def f(x,y=10):
return x*g(y)
print(f(5)) #->500
Cependant, supposons que nous ne voulons pas nous en souvenir et de copier une valeur par défaut du mot de paramètre y
à la définition de la fonction externe (surtout si il y a plusieurs couches de fonctions externes). Dans l'exemple ci-dessus, cela signifie que nous voulons utiliser le paramètre, déjà définis dans g
.
Une façon de le faire:
def f(x,y=None):
if y==None: return x*g()
else: return x*g(y)
Mais est-il une manière plus propre à faire de même?
Quelque chose comme:
def f(x,y=empty()):
return x*g(y)
OriginalL'auteur Nik | 2016-04-15
Vous devez vous connecter pour publier un commentaire.
Question intéressante! Voici une autre possibilité, toutefois, cela exige de la remise dans le deuxième paramètre comme un paramètre nommé.
OriginalL'auteur dorian
Une limitation de signatures telles que
def f(x, y=None)
oudef f(x, **kwargs)
est que les lecteurs ont à creuser dans le code source ou de la documentation pour savoir ce qu'il se passe avecy
. Tenir à quelque chose de simple et directe:OriginalL'auteur Alex Hall
C'est possible:
Mais il est sans doute moins clair que ce que vous aviez à l'origine (défaut
y
àNone
).Une option qui permet de ne pas limiter la définition de l'ordre de
f
etg
, et devrait continuer à travailler si la fonction par défaut deg
est modifié dynamiquement:__defaults__
est utilisé à la place defunc_defaults
Que faire si vous
y=None
à la fonction?Dans ce cas, cela n'aurait aucun sens, car
None**2
va augmenter. Mais dans le cas général, si vous voulez passerNone
à la fonction, ce que vous pouvez faire est d'initialiser une sentinelledefault_y = object()
à l'extérieur de la portée, puis de contre-vérifier que dans le conditionnel. Il est garanti que tout ce qui est passé ne sera pas accidentellement être identique àdefault_y
.OriginalL'auteur wim
Je voudrais commencer par dire que si les arguments ont été les mots clés de ce serait donc facile:
si vous utilisez des arguments positionnels il n'est pas aussi facile bien que votre exemple est un cas spécifique qui fonctionne de la même manière:
Mais c'est un cas très spécifique:
La solution générique nécessite un peu de code, mais permet tout de signature à être fusionnés en un autre, par exemple:
Ce qui peut être obtenu avec le code suivant (je ne peux pas trouver un moyen plus simple de faire ce qui fonctionne avec des cas ci-dessus)
OriginalL'auteur Tadhg McDonald-Jensen
Si vous pouvez modifier
g
, alors cela fonctionne:OriginalL'auteur BallpointBen