Tenir compte de la fonction suivante:Créer des variables locales par programmation à partir d'un dictionnaire Julia
function func(vars::Dict{Symbol, Any})
end
Je veux créer des variables locales dans un périmètre de » func
, où: noms de variables sont chacun la clé de la vars
et les valeurs de variable sont des valeurs dans un vars
correspondant à la clé donnée.
Je sais que je pourrais utiliser eval()
quelque chose comme:
for (k, v) in vars
eval(:($k = $v))
end
Cependant, les variables qui définira dans la portée globale, ce qui a des répercussions sur la performance et pourraient remplacer les variables globales existantes.
P.S. J'ajouterai un contexte au cas où vous auriez des suggestions radicalement différentes de l'approche que je préconise. J'implémente un wrapper autour du JuMP permettant aux utilisateurs de créer dynamiquement des modèles d'optimisation avec des expressions de contraintes arbitraires. Étant donné que les expressions de contrainte sont définies à l'aide de symboles et que JuMP
requiert la définition de ces symboles dans la portée actuelle, je souhaite que l'utilisateur fournisse ces symboles et leurs valeurs dans un dictionnaire à la fonction. La définition globale des symboles serait lourde car l'utilisateur devrait idéalement pouvoir exécuter la fonction plusieurs fois avec les mêmes expressions de contrainte (c'est-à-dire les mêmes symboles) mais des valeurs différentes.
vous devriez [escape] (http://docs.julialang.org/en/latest/manual/metaprogramming/#hygiene) l'expression par 'esc (: ($ k = $ v))' – Gnimuc
@GnimucK. Mais cela ne résoudra toujours pas le problème de la déclaration des variables dans une portée globale. – aberdysh
hmm ... en effet, ça ne marchera pas. est-il possible de construire ce wrapper dans un module? 'eval' va générer des variables dans la portée du module. – Gnimuc