मैं पाइथन में कुछ अवलोकन योग्य संग्रह/अनुक्रम रखना चाहता हूं जो मुझे परिवर्तन की घटनाओं को सुनने की अनुमति देता है, जैसे नए आइटम जोड़ने या आइटम अपडेट करने के लिए:
list = ObservableList(['a','b','c'])
list.addChangeListener(lambda new_value: print(new_value))
list.append('a') # => should trigger the attached change listener
data_frame = ObservableDataFrame({'x': [1,2,3], 'y':[10,20,30]})
data_frame.addChangeListener(update_dependent_table_cells) # => allows to only update dependent cells instead of a whole table
ए। मुझे निम्नलिखित परियोजना मिली जो देखने योग्य संग्रह के कार्यान्वयन प्रदान करती है और काफी आशाजनक दिखती है:
https://github.com/dimsf/Python-observable-collections
यह वही करता है जो मैं चाहता हूं:
from observablelist import ObservableList
def listHandler(event):
if event.action == 'itemsUpdated':
print event.action + ', old items: ' + str(event.oldItems) + ' new items: ' + str(event.newItems) + ' at index: ' + str(event.index)
elif event.action == 'itemsAdded' or event.action == 'itemsRemoved':
print(event.action + ', items: ' + str(event.items) + ' at index: ' + str(event.index))
myList = ObservableList()
myList.attach(listHandler)
#Do some mutation actions, just like normal lists.
myList.append(10)
myList.insert(3, 0)
हालांकि, आखिरी बदलाव 6 साल पहले है और मैं सोच रहा हूं कि क्या कुछ और अद्यतित हैं या पायथन विकल्पों में निर्माण हैं?
B. मुझे RxPy भी मिला: https://github.com/ReactiveX/RxPY
import rx
list = ["Alpha", "Beta", "Gamma"]
source = rx.from_(list)
source.subscribe(
lambda value: print(value),
on_error = lambda e: print("Error : {0}".format(e)),
on_completed = lambda: print("Job Done!")
)
क्या सदस्यता को खुला रखना किसी तरह संभव है, ताकि मैं सदस्यता के बाद सूची में नए मान जोड़ सकूं? डमी कोड:
source.subscribe(..., keep_open = True)
source.append("Delta") # <= does not work; there is no append method
source.close()
दूसरे शब्दों के साथ: क्या मैं आरएक्सपीई स्रोतों को अवलोकन योग्य संग्रह के रूप में उपयोग कर सकता/सकती हूं?
सी। घटनाओं को संभालने और पर्यवेक्षक पैटर्न को लागू करने के लिए पाइथन में कई अलग-अलग संभावनाएं मौजूद हैं:
पायथन ऑब्जर्वर पैटर्न: उदाहरण, टिप्स?
अजगर में पर्यवेक्षक पैटर्न को लागू करने के वैकल्पिक तरीके
Python3 में ऑब्जर्वर पैटर्न को लागू करने के लिए डेकोरेटर्स का उपयोग करना
=> पायथन में अवलोकनीय संग्रहों को लागू करने के लिए अनुशंसित/पायथनिक तरीका क्या है? क्या मुझे (पुराना?) ए या बी के एक अनुकूलित रूप का उपयोग करना चाहिए (जो एक अलग उद्देश्य की पूर्ति करता प्रतीत होता है?) या सी से एक और रणनीति भी?
=> क्या किसी तरह उस संभावनाओं को मानकीकृत करने और सीधे पायथन में डिफ़ॉल्ट अवलोकन योग्य संग्रह शामिल करने की योजना है?
संबंधित प्रश्न, डेटाफ़्रेम के लिए विशिष्ट:
2 जवाब
मैंने कभी भी RxPy का उपयोग नहीं किया है, लेकिन ऐसा लगता है कि यह rx पैटर्न का कार्यान्वयन JS/ts एक के बहुत करीब है।
सबसे पहले आप एक अवलोकन योग्य बनाना चाहते हैं जिसका उपयोग आप दोनों में डेटा और पर्यवेक्षक को पुश करने के लिए करते हैं। यह एक विषय है, संभावित रूप से एक व्यवहार विषय या फिर से खेलना विषय है। विषय बनाएं, फिर on_next() ऑपरेटर का उपयोग करके उसमें नए मान डालें।
आपके लिए दूसरा प्रश्न, ऐसा लगता है कि आप कई अवलोकनों को एक अवलोकन में "गठबंधन" करना चाहते हैं। ऐसा करने के कई तरीके हैं, लेकिन सबसे अधिक संभावना है कि आप जो खोज रहे हैं वह कम्बाइनटेस्ट या कॉनकैट है। ऑपरेटरों को लूटें।
अगर मैं आपका दूसरा उदाहरण लेता हूं तो कोड इस तरह दिखेगा:
from rx.subject.subject import Subject
list = ["Alpha", "Beta", "Gamma"]
# assuming that you want each item to be emitted one after the other
subject = Subject()
subject.subscribe(
lambda value: print(value),
on_error = lambda e: print("Error : {0}".format(e)),
on_completed = lambda: print("Job Done!")
)
subject.on_next('Alpha')
subject.on_next('Beta')
subject.on_next('Gamma')
subject.on_next('Delta')
यदि आप एक BehaviourSubject का उपयोग करते हैं, तो आप एक प्रारंभिक मूल्य प्रदान करने में सक्षम होंगे, और जब कोई नया पर्यवेक्षक सदस्यता लेता है, तो उसे अंतिम उत्सर्जित मूल्य प्राप्त होगा। यदि आप रीप्लेसब्जेक्ट का उपयोग करते हैं तो आप मान प्रदान कर सकते हैं, फिर सदस्यता लें, पर्यवेक्षक को इस बिंदु तक उत्सर्जित सभी मान प्राप्त होंगे।
बस एक कार्यान्वयन मिला जो RxPy पर आधारित है। अंतिम परिवर्तन 2018 से है और ऐसा लगता है कि यह अभी तक RxPY 3.x के लिए तैयार नहीं है।
https://github.com/shyam-s00/ObservableCollections
https://github.com/shyam-s00/ObservableCollections/issues/1
from reactive.ObservableList import ObservableList
ol = ObservableList([1, 2, 3, 4])
ol.when_collection_changes() \
.map(lambda x: x.Items) \
.subscribe(print, print)
ol.append(5)
यह प्रावधान
- अवलोकन योग्य सूची
- अवलोकनीय निर्देश
- नमूदार सेट
यह भी देखें https://github.com/ReactiveX/RxPY/issues/553
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।