Wie erstellt man eine Funktion, die einen willkürlichen Wert innerhalb eines Wörterbuchs oder Objekts setzen kann? Oder mit anderen Worten, eine Funktion, die einen beliebigen Wert setzen kann.Absteigend durch ein Objekt und Unterobjekte zum Festlegen eines beliebigen Elements oder Attributs in der Hierarchie
Beispiel: Angenommen, Sie ein Wörterbuch wie dieses:
my_dict = {
'foo' : 'bar',
'subdict':{
'sub1' : 1,
'sub2' : 2
}
}
Ich möchte eine setter
Funktion erstellen, wie diese verwendet werden:
x = 'x'
# I want to be able to set normal dictionary items
setter(lambda val: val['foo'], my_dict, x)
# And also set subdictionary items
setter(lambda val: val['subdict']['sub1'], my_dict, x)
# Setting items that don't exist would be great too
setter(lambda val: val['new_item'], my_dict, x)
# If my_dict was a class, I'd like to use the same function, like this
setter(lambda val: val.myproperty, my_dict, x)
# Would also be cool if it worked with lists
my_list = [1, 2]
setter(lambda val: val[1], my_list, x)
ich nicht ein offensichtliches gesehen haben Weg, dies zu tun. Die naive Art und Weise unten eindeutig nicht funktioniert:
def setter(get_attr_func, param, x):
# This doesn't work, but I'd like something like it
get_attr_func(param) = x
ich die setattr
verwenden könnte, etwas zu bauen, die für Attribute auf Klassen funktionieren. Ich könnte etwas anderes bauen, das für Wörter in Wörterbüchern funktioniert. Aber ich habe keine Ahnung, wie Sie das für Unterwörterbücher oder Unterobjekte tun würden.
Die Antwort muss nicht in dieser exakten Form sein. Ich möchte nur eine Funktion schreiben, die ein beliebiges Attribut/Objekt innerhalb einer Objekthierarchie setzt.
Netter Versuch. Es sieht für alle Werte gut aus, außer für das Unterwörterbuch, in dem Sie die Aufrufkonvention ändern. Vielleicht ist das einfach nicht möglich. Zeiger, wie sie sie in C haben, würden wirklich helfen. – speedplane
@speedplane Ich habe meine Antwort durch eine ersetzt, die genau wie das Beispiel in Ihrer Frage funktioniert. Es ist völlig typunabhängig - es funktioniert mit jedem Objekt, das Sie erhalten oder Attribute oder Objekte festlegen können. – agf
Das ist beeindruckend. Ich sehe, dass man beliebig viele Ops aneinanderreihen kann, so dass schickere Sachen wie folgt funktionieren würden: 'set_my_dict_to_x (LocationProxy() ['item'] [0] .prop ['item2'] [3])'. Sehr cool! – speedplane