currectly, je suis en train de ce qui suit: Certaines fonctions mutator
accepte la portée locale autre fonction à l'aide locals()
Comment modifier les variables d'une autre portée?
def mutator(locals):
locals['n'] = 10
locals['l'].append(10)
def f():
n = 1
l = [1]
mutator(locals())
print(n,l) # >>> 1, [1,10]
f(None)
et qui fonctionne comme prévu: j'ai pu modifier le contenu de la liste mutables, mais a échoué à « rebind » une autre immuable int
au même nom.
Actuellement, je vois quelques options:
eval()
,exec()
& Co- Jouer avec des cadres de pile & variables locales dans
mutator()
- Conserver ces variables dans un
dict
: pas très pratique, mais probablement le meilleur un
La restriction est: cible fu nction f()
peut contenir un seul appel de fonction, éventuellement avec des arguments, et cette fonction devrait pouvoir modifier les valeurs dans la portée actuelle f()
s.
Alors ... existe-t-il un moyen de réintroduire la valeur de la variable (lier un autre objet) lors de l'exécution? Je ne crois pas qu'il n'y ait pas de bonne astuce pour réaliser cela!
Voici un exemple de la chose que je suis en train de réaliser:
def view(request): # Yes, that's Django!
q = MyModel.objects.all()
data = { 'some_action': True, 'items_per_page': 50 } # defaults. Mutators can change this
mutators.launch(locals(), data) # Launch mutators that may want to narrow the QuerySet
if data['some_action']: # do something useful if no mutator has disabled it
...
# paginate using data['items_per_page']
Je ne veux pas utiliser data
dict ici: possibilité de les modifier en tant que variables locales seraient beaucoup mieux & joli. Notez que q
objet QuerySet est mutable & Les mutateurs peuvent modifier son contenu.
nécessite plus de formatage. indenter les corps de méthode. – Robert
Qu'essayez-vous exactement d'accomplir? – Falmarri
Cela va être un moyen de réglage externe de la logique interne de la fonction, pour ainsi dire :) Comme changer certains booléens on/off pour activer/désactiver les fonctionnalités, affiner une liste à un sous-ensemble, etc. Je suis sûr que c'est la meilleure façon de mettre en œuvre un bon cadre de réglage et d'extension pour un système hautement personnalisable. – kolypto