Definieren Sie Funktionen (Methoden) in Python dynamisch

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

Definieren Sie Funktionen (Methoden) in Python dynamisch
[Python3] Definieren Sie globale Variablen in einer Funktion dynamisch
Rufen Sie Methoden in Python dynamisch auf
String-Objektmethoden in Python
Importieren Sie Skripte dynamisch in Python
Überschreiben Sie Bibliotheksfunktionen in Python
Python-Funktionen mit Chemoinfomatik gelernt
Laden Sie JSON-Typen dynamisch mit Python
Python-Funktionen
Verwendung globaler Variablen in Python-Funktionen
Verwenden Sie einfach Ihre eigenen Funktionen in Python
Ein Forscher eines Pharmaunternehmens fasste die Funktionen in Python zusammen
Private Methoden und Felder in Python [Verschlüsselung]
Neue Funktionen in Python 3.4.0 (3) - Generische Funktionen für den Einzelversand
So füllen Sie mit Python dynamisch Nullen aus
Zusammenfassung der integrierten Methoden usw. der Python-Liste
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
# Python-Grundlagen (Funktionen)
FizzBuzz in Python
SQLite in Python
[Anfänger] Python-Funktionen
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Python Einfach zu bedienende Funktionen
Quad-Tree in Python
Python-Grundlagen: Funktionen
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken