मैं पाइथन में कुछ अवलोकन योग्य संग्रह/अनुक्रम रखना चाहता हूं जो मुझे परिवर्तन की घटनाओं को सुनने की अनुमति देता है, जैसे नए आइटम जोड़ने या आइटम अपडेट करने के लिए:

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 में ऑब्जर्वर पैटर्न को लागू करने के लिए डेकोरेटर्स का उपयोग करना

=> पायथन में अवलोकनीय संग्रहों को लागू करने के लिए अनुशंसित/पायथनिक तरीका क्या है? क्या मुझे (पुराना?) ए या बी के एक अनुकूलित रूप का उपयोग करना चाहिए (जो एक अलग उद्देश्य की पूर्ति करता प्रतीत होता है?) या सी से एक और रणनीति भी?

=> क्या किसी तरह उस संभावनाओं को मानकीकृत करने और सीधे पायथन में डिफ़ॉल्ट अवलोकन योग्य संग्रह शामिल करने की योजना है?

संबंधित प्रश्न, डेटाफ़्रेम के लिए विशिष्ट:

टेबल/स्प्रेडशीट्स (जैसे पांडा डेटाफ़्रेम) को देखने योग्य कैसे बनाएं, ट्रिगर्स का उपयोग करें या ईवेंट बदलें?

4
Stefan 28 जिंदा 2021, 18:19

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 का उपयोग करते हैं, तो आप एक प्रारंभिक मूल्य प्रदान करने में सक्षम होंगे, और जब कोई नया पर्यवेक्षक सदस्यता लेता है, तो उसे अंतिम उत्सर्जित मूल्य प्राप्त होगा। यदि आप रीप्लेसब्जेक्ट का उपयोग करते हैं तो आप मान प्रदान कर सकते हैं, फिर सदस्यता लें, पर्यवेक्षक को इस बिंदु तक उत्सर्जित सभी मान प्राप्त होंगे।

1
Jean-Xavier Raynaud 4 फरवरी 2021, 20:06

बस एक कार्यान्वयन मिला जो 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

0
Stefan 29 जिंदा 2021, 13:31