2017-07-23 6 views
0

Lors de l'écriture d'une fonction qui accepte un objet mutable, qui peut être modifié, est-il nécessaire de renvoyer cet objet à l'appelant?Python, Dois-je renvoyer un objet qui a été passé en paramètre?

Je veux dire par ... nécessaire

  1. Y at-il une ligne directrice spécifique PEP autour de ce sujet?
  2. Sinon, quel est le plus commun dans le monde de la programmation Python?

Un peu de code:

def foo(args): 
    args['a'] = 'new-value' 
    args['b'] = args['b'] + 1 

    # is there a need for a 'return args' ? 

args = {'a': 'old-value', 'b': 99} 
foo(args) # is there a need for args = foo(args) 
print(args['a'], args['b']) # outputs new-value 100 

"explicite est mieux que implicite." me fait penser que je devrais faire le potentiel pour args de changer très explicite dans le corps principal, de sorte que l'on n'a pas à regarder dans la fonction pour voir si args pourrait être changé ...

+0

Je pense qu'il est préférable d'avoir return afin que je puisse faire 'print (foo (args))' immédiatement – ewwink

+1

Habituellement, les méthodes qui modifient l'objet renvoient 'None' à moins qu'il ne soit logique de retourner quelque chose d'autre (par exemple,' popitem'). Je n'ai pas de pointeur pour le moment. – spectras

+0

Retour avec un mail pertinent de l'un des développeurs python. Pas un PEP, mais intéressant lire quand même: https://mail.python.org/pipermail/python-dev/2003-October/038855.html – spectras

Répondre

2

Ceci n'est couvert par aucune PEP, et c'est vraiment à la hauteur de l'auteur. En général, dans la conception de l'API, les méthodes qui modifient les arguments ne renverront rien, donc vous n'oublierez pas que vous êtes en train de muter des choses. Soyez très prudent avec ce genre de conception.

0

En termes de ce qui est plus commun dans python, il y a quelques exemples où l'objet passé est modifié. Ceux-ci tendent à être des méthodes de l'objet à modifier (par exemple list.append, où la liste est un type), mais la plupart des fonctions tendent à prendre une copie de l'objet passé et en retournent un nouveau (par exemple string.strip, où string est le module string).

Ceci bien sûr aussi fait apparaître str.strip qui est aussi une méthode d'un objet de type str qui renvoie un nouvel objet.