Ich bin süchtig danach und hoffe, dass es jemandem hilft.
** Was Sie versuchen **: Definieren Sie eine Funktion, die drei verschiedene Pfade dynamisch anzeigt
Da das Innere von "def func" beim tatsächlichen Aufruf der Funktion ausgewertet wird, ist der Wert von "t" der letzte von "for" verarbeitete Wert.
>>> path_freq = [{"path": "/pickup/6162449", "freq": 1, "name": "a"}, {"path": "/pickup/6162466", "freq": 1, "name": "b"}, {"path": "/pickup/6162461", "freq":1, "name": "c"}]
>>> task_list = {}
>>> for t in path_freq:
... def func():
... print(t)
... task_list.update({func: t['path']})
...
>>> task_list
{<function func at 0x101184848>: '/pickup/6162461', <function func at 0x101184938>: '/pickup/6162466', <function func at 0x1011848c0>: '/pickup/6162449'}
>>> for k,v in task_list.items():
... k()
...
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
Versuchen Sie etwas Ähnliches in Ruby
[2] pry(main)> path_freq = [{"path" => "/pickup/6162449", "freq" => 1, "name" => "a"}, {"path" => "/pickup/6162466", "freq" => 1, "name" => "b"}, {"path" => "/pickup/6162461", "freq" => 1, "name" => "c"}]
=> [{"path"=>"/pickup/6162449", "freq"=>1, "name"=>"a"},
{"path"=>"/pickup/6162466", "freq"=>1, "name"=>"b"},
{"path"=>"/pickup/6162461", "freq"=>1, "name"=>"c"}]
[3] pry(main)> path_freq.each do |t|
[3] pry(main)* define_method :hoge do
[3] pry(main)* puts t
[3] pry(main)* end
[3] pry(main)* task_list.merge!({hoge => t})
[3] pry(main)* end
{"path"=>"/pickup/6162449", "freq"=>1, "name"=>"a"}
{"path"=>"/pickup/6162466", "freq"=>1, "name"=>"b"}
{"path"=>"/pickup/6162461", "freq"=>1, "name"=>"c"}
=> [{"path"=>"/pickup/6162449", "freq"=>1, "name"=>"a"},
{"path"=>"/pickup/6162466", "freq"=>1, "name"=>"b"},
{"path"=>"/pickup/6162461", "freq"=>1, "name"=>"c"}]
[4] pry(main)> task_list
=> {nil=>{"path"=>"/pickup/6162461", "freq"=>1, "name"=>"c"}}
[5] pry(main)> hoge
{"path"=>"/pickup/6162461", "freq"=>1, "name"=>"c"}
=> nil
Ich dachte, dass Python und Ruby ähnliche Sprachspezifikationen haben, aber ich denke nicht, dass dies bedingungslos gesagt werden kann.
Methoden werden in Python als Objekte behandelt, in Ruby jedoch nicht. Im Fall von Ruby wird die hoge
-Methode, wenn sie durch define_method definiert ist, in diesem Beispiel als die Methode des main Object
definiert. Sie können die hoge-Methode nicht als Objekt in ein Array einfügen. Der Grund, warum nil
im Schlüssel von task_list enthalten ist, ist übrigens, dass der Rückgabewert von Puts in Ruby nil
ist.
Versuchen Sie dann, die Methode auf andere Weise zu definieren. Ich habe versucht, der Klasse mit setaddr in Python eine Methode hinzuzufügen, aber das Verhalten war das gleiche.
>>> class Test():
... pass
>>> path_freq = [{"path": "/pickup/6162449", "freq": 1, "name": "a"}, {"path": "/pickup/6162466", "freq": 1, "name": "b"}, {"path": "/pickup/6162461", "freq":
1, "name": "c"}]
>>> task_list = []
>>> for t in path_freq:
... def func():
... print(t)
... setattr(Test, t['name'], func)
... task_list.append(func)
...
>>> for f in task_list:
... f()
...
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
>>> for t in path_freq:
... def func(self):
... print(t)
... setattr(Test, t['name'], func)
...
>>> Test().a()
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
>>> Test().b()
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
>>> Test().c()
{'path': '/pickup/6162461', 'freq': 1, 'name': 'c'}
Ich habe versucht, den Wert von List als Standardwert des Arguments zu übergeben, da die Signatur der Funktion nicht zu spät ausgewertet wird.
>>> path_freq = [{"path": "/pickup/6162449", "freq": 1, "name": "a"}, {"path": "/pickup/6162466", "freq": 1, "name": "b"}, {"path": "/pickup/6162461", "freq":1, "name": "c"}]
>>> task_list = {}
>>> for t in path_freq:
... def func(path=t['path']):
... print(path)
... task_list.update({func: t['path']})
...
>>> for k,v in task_list.items():
... k()
...
/pickup/6162461
/pickup/6162466
/pickup/6162449
:+1:
Recommended Posts