Versuchen Sie die folgende Blockdiagrammberechnung mit reaktiven Erweiterungen (diese Berechnung selbst hat keine Bedeutung).
Dieses Mal werde ich es mit Python versuchen. Installieren Sie zunächst die Python-Version von Reactive Extensions.
Terminal
pip install Rx
Beschreiben Sie das Platzierungsmodul und die Verkabelung des Blockdiagramms in JSON.
test.json
{
"modules": [
{"name":"add1", "module_type":"add", "inputs":["sin1", "const1"]},
{"name":"add2", "module_type":"add", "inputs":["mul1", "div1"]},
{"name":"mul1", "module_type":"mul", "inputs":["sub1", "add1"]},
{"name":"sub1", "module_type":"sub", "inputs":["sin1", "cos1"]},
{"name":"div1", "module_type":"div", "inputs":["cos1", "const2"]},
{"name":"sin1", "module_type":"sin", "inputs":["const1"]},
{"name":"cos1", "module_type":"cos", "inputs":["add1"]},
{"name":"out1", "module_type":"out", "inputs":["add2"]},
{"name":"const1", "module_type":"const", "value":1.0},
{"name":"const2", "module_type":"const", "value":2.0}
]
}
Die Modulerstellung, die Modulverdrahtung, die Einstellung des konstanten Werts und die Anzeige der Berechnungsergebnisse werden durchgeführt.
test.py
# -*- coding: utf-8 -*-
from rx.subjects import Subject
import json, operator, math
if __name__ == '__main__':
#Lesen Sie JSON
with open('test.json') as f:
j = json.load(f)
#Modulerstellung
modules = { m['name']:Subject() for m in j['modules'] }
#Modulverkabelung
for m in filter(lambda m: m['module_type'] != 'const', j['modules']):
module_type = m['module_type'];
self_name = m['name']
input_names = m['inputs']
if module_type == 'add':
modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.add) \
.subscribe(modules[ self_name ].on_next)
elif module_type == 'sub':
modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.sub) \
.subscribe(modules[ self_name ].on_next)
elif module_type == 'mul':
modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.mul) \
.subscribe(modules[ self_name ].on_next)
elif module_type == 'div':
modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.truediv) \
.subscribe(modules[ self_name ].on_next)
elif module_type == 'sin':
modules[ input_names[0] ].select(math.sin).subscribe(modules[ self_name ].on_next)
elif module_type == 'cos':
modules[ input_names[0] ].select(math.cos).subscribe(modules[ self_name ].on_next)
elif module_type == 'tan':
modules[ input_names[0] ].select(math.tan).subscribe(modules[ self_name ].on_next)
elif module_type == 'out':
modules[ input_names[0] ].subscribe(print) #Anzeige der Berechnungsergebnisse
#Stellen Sie einen konstanten Wert ein
for m in filter(lambda m: m['module_type'] == 'const', j['modules']):
self_name = m['name']
value = m['value']
modules[ self_name ].on_next(value)
Ergebnis
1.9082290502110406
ReactiveExtensions Ich werde die diesmal verwendete Klassen- und Erweiterungsmethode erläutern.
Subject Das Fach ist eine Klasse, die sowohl Beobachter (Beobachter) als auch Beobachtbar (Beobachter) hat. Verwenden Sie den Namen als Schlüssel, um das Wörterbuch für die spätere Verwendung in der Verkabelung zu erstellen.
Auszug
#Modulerstellung
modules = { m['name']:Subject() for m in j['modules'] }
Select Eine Single-Term-Operation empfängt (abonniert) den berechneten Wert von select und sendet ihn an das nächste Modul (on_next).
Auszug
modules[ input_names[0] ].select(math.sin).subscribe(modules[ self_name ].on_next)
Zip Bei der Binomialoperation wird der berechnete Wert empfangen (abonnieren) und an das nächste Modul (on_next) gesendet, nachdem die beiden Eingabewerte ausgerichtet wurden.
Auszug
modules[ input_names[0] ].zip(modules[ input_names[1] ], operator.add) \
.subscribe(modules[ self_name ].on_next)
Ich werde es nur für den Fall überprüfen.
test_check.py
# -*- coding: utf-8 -*-
import math
if __name__ == '__main__':
sin1 = math.sin(1.0)
add1 = sin1+1.0
cos1 = math.cos(add1)
sub1 = sin1-cos1
mul1 = sub1*add1
div1 = cos1/2.0
add2 = mul1+div1
out = add2
print(out)
Ergebnis
1.9082290502110406
Ich habs gemacht