donné une fonction avec un paramètre a
et deux autres paramètres (pickle_from
, pickle_to
), je voudrais:entrée/décorateur de sortie de résultat de la fonction de décapage
- charge et retourner l'objet décapé situé à
pickle_from
, sipickle_from
n'est pasNone
. Si c'estNone
, calculez une fonction dea
et renvoyez-la. - Videz le résultat ci-dessus à
pickle_to
sipickle_to
n'est pasNone
.
Avec une seule fonction, ceci est simple. Si pickle_from
n'est pas nul, la fonction charge simplement le résultat picklé et le renvoie. Dans le cas contraire, il exécute un certain nombre de calculs avec a
, et le renvoie à pickle_to
, puis renvoie le résultat du calcul.
try:
import cPickle as pickle
except:
import pickle
def somefunc(a, pickle_from=None, pickle_to=None):
if pickle_from:
with open(pickle_from + '.pickle', 'rb') as f
res = pickle.load(f)
else:
# Re-calcualte some time-intensive func call
res = a ** 2
if pickle_to:
# Update pickled data with newly calculated `res`
with open(pickle_to + '.pickle', 'wb') as f:
pickle.dump(res, f)
return res
Ma question porte sur la façon de construire un décorateur afin que ce processus peut former une enveloppe autour de plusieurs fonctions similaires à celles somefunc
, réduisant le code source dans le processus.
Je voudrais pouvoir écrire quelque chose comme:
@pickle_option
def somefunc(a, pickle_from=None, pickle_to=None)
# or do params need to be in the decorator call?
# remember, "the files are in the computer"
res = a ** 2
return res
Est-ce possible? Quelque chose à propos des décorateurs fait exploser ma tête, alors je refuserai poliment de poster ici "ce que j'ai essayé".
Les paramètres '' pickle_from'', 'pickle_to' et' pathname' ne devraient-ils pas être des paramètres pour le décorateur? Pourquoi 'somefunc' en a-t-il? Vous pouvez les avoir où vous voulez, mais cela affecte la façon dont le décorateur doit être codé. –
Je pense qu'ils devraient être dans la fonction elle-même, car ils sont conçus pour être spécifiés par l'utilisateur plutôt que dans le code lui-même. Mais d'où ma question –
@Rawing bien, tenir le coup. Si elles sont données au décorateur, il n'y a aucun moyen de changer le comportement lorsque vous appelez la fonction. Il chargera toujours ou jamais la valeur. – mwchase