8
votes

Attribuer une passe à une fonction dans Python

J'ai un morceau de code qui définit une fonction qui prend une fonction comme argument, comme: xxx

maintenant, je souhaite fournir une valeur par défaut de F qui ne fait rien. Je pensais donc que j'utiliserais Pass, comme si: xxx

mais cela ne compile pas. Comment devrais-je le faire?


4 commentaires

À propos du formatage: Ne laissez pas d'espaces autour du = dans la signature d'une fonction.


Bien que nous soyons la forme du formatage, n'utilisez pas moins de 4 espaces pour l'indentation - 2 espaces est essentiellement illisible - et ne mettez pas de parenthèses autour des conditionnels comme si vous écrivez C.


Ce que tout le monde dit, c'est que vous devriez lire le PEP 8


Ah, mon arrière-plan C ++ / Java / Perl est montrant = p


6 Réponses :


4
votes

Vous ne pouvez pas attribuer vide. Mais vous pouvez créer une fonction interne, que vous allez attribuer à f . xxx


0 commentaires

9
votes

Pourquoi pas simplement cela?

def stuff(n, f=None):
    if f is None:
        return
    return f(n)


7 commentaires

Amélioration mineure: PEP8 conseille d'utiliser None Au lieu de == Aucune ( Justification ).


Merci, je me suis demandé ce qui était préférable mais jamais pensé à vérifier! Réponse corrigée en conséquence.


+1 Beaucoup mieux que les autres solutions, car il énonce clairement l'intention.


En ce qui concerne cette question a une réponse «correcte», ceci est-ce. Les autres réponses toutes obstruent inutilement une fonction aussi triviale.


Si l'OP souhaite transmettre l'objet de fonction sur une autre fonction, cette approche ne fonctionne pas.


Homme, j'aimerais t'aimer de te donner la réponse ... Bien que cela réponde exactement à la manière dont je décrivais la question, ma description a été simplifiée ... dans mon programme, cela fait plus que appeler f (n) et f (n) et f (n) s'appelle plusieurs fois. Si je pouvais choisir deux réponses, je choisirais cela.


Aucun problème ! J'ai souligné que space_c0wb0y, la réponse correcte dépendait de votre scénario exact, alors je pensais que vous choisiriez ce qui convient le mieux :)



19
votes

Le Pass code> est un mot-clé pour l'interprète, un titulaire d'un lieu pour sinon rien. Ce n'est pas un objet que vous pouvez attribuer. Vous pouvez utiliser un NO-OP Lambda.

f = lambda x: None


3 commentaires

OT, mais pourquoi les concepteurs devraient-ils créer un nouveau mot-clé juste pour un noop? bizarre


@gberryman parce que Python n'a pas de délimiteurs de blocs. Dans des langues que vous écrivez généralement {} . Mais en python, ce serait ... rien. Donc, passe est là pour le rendre syntaxiquement complet.


@gberryman où? PASS est juste un mot-clé pour agir comme un espace réservé pour un bloc libre à vide. Cela facilite probablement l'analyse plus facile. Ce n'est pas un objet. Aucun n'est un objet qui signifie aucune autre valeur. Ils ont une sémantique différente.



5
votes

Un peu plus court: xxx

ou même mieux: xxx


9 commentaires

Votre première version Python3k est-elle? Cette syntaxe ne semble pas être valide pour Python 2.7.


@Bethor: Merci, corrigé. Testé sur 2,6.


ou même plus simple: defs def (n, f = aucun): f et f (n)


@Codecraft: En effet. Mais je dirais que dans cette affaire, la clarté souffre inutilement.


D'accord. En utilisant des opérateurs logiques pour le flux de contrôle rend les choses vraiment perl et ne sont probablement pas très pythoniques


Ick: N'utilisez pas l'opérateur ternaire comme contrôle de flux! Cette réponse encourage l'optimisation du nombre de lignes au lieu de, et aux dépens de la clarté.


@Glenn: Je conviens que ma réponse n'est pas bonne pour le cas où la fonction n'a pas de valeur de retour, et seule l'effet secondaire compte. Mais accepteriez-vous que cela irait bien si l'accent était mis sur la valeur de retour?


Je ne vois aucun avantage à cette réponse de Bethor.


@Glenn: Je pensais et je suis d'accord que la réponse de Bethor est meilleure, à l'exception du cas lorsque l'objet de fonction elle-même sera transmis comme argument à d'autres fonctions.



3
votes

La fonction générique noop: xxx

Vous pouvez appeler xxx


0 commentaires

1
votes

J'irais avec un

if foo:
    foo()


0 commentaires