L ifUddlmZddlZddlZddlmZmZmZddlm Z ddl m Z m Z m Z ddlmZmZmZmZmZddlmZmZddlmZdd lmZmZdd lmZdd lmZ dd l!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2m3Z3m4Z4erddl5m6Z6dZ7de8d<e7dZ9de8d<e dGddZ:e dGddZ;e;e:zZd*d!Z?e Gd"d#Z@e Gd$d%ZAd+d&ZB d,d'ZCe Gd(d)e3ZDy)-) annotationsN)IteratorKeysViewMutableMapping)deepcopy) dataclassfieldreplace) TYPE_CHECKINGAnyFinal TypeAliascast)configutil)get_dg_singleton_instance)StreamlitAPIExceptionUnserializableSessionStateError) WidgetState) WidgetStates)get_script_run_ctx) RegisterWidgetResultTValueFieldName WidgetArgsWidgetCallbackWidgetMetadatais_array_value_field_name is_element_idis_keyed_element_id)apply_presenter) QueryParams) CacheStatCacheStatsProvider group_stats)SessionManagerz$$STREAMLIT_INTERNAL_KEYr STREAMLIT_INTERNAL_KEY_PREFIX_SCRIPT_RUN_WITHOUT_ERRORSSCRIPT_RUN_WITHOUT_ERRORS_KEYT)frozenceZdZUdZded<y) Serializedz:A widget value that's serialized to a protobuf. Immutable.WidgetStateProtovalueN__name__ __module__ __qualname____doc____annotations__k/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/streamlit/runtime/state/session_state.pyr,r,=s D r6r,ceZdZUdZded<y)Valuez0A widget value that's not serialized. Immutable.r r.Nr/r5r6r7r9r9Ds : Jr6r9rWStateceZdZUdZeeZded<eeZded<ddZ ddZ dd Z dd Z dd Z dd Zdd Zd dZd!dZd"dZd#dZd$dZd%dZ d&dZd'dZd(dZd)dZy)*WStateszA mapping of widget IDs to values. Widget values can be stored in serialized or deserialized form, but when values are retrieved from the mapping, they'll always be deserialized. default_factoryzdict[str, WState]stateszdict[str, WidgetMetadata[Any]]widget_metadatac,tj|SNrrepr_selfs r7__repr__zWStates.__repr__Xzz$r6c||jj|}| t|t|tr |j S|j j|}| t|td|j jd}|r|j j|nd}t|rtd|j}n$|dk(rtjtd|}|j|}|jt!||t ||j|<|S)zReturn the value of the widget with the given key. If the widget's value is currently stored in serialized form, it will be deserialized first. Nrr.r json_valuestr) value_type)r?getKeyError isinstancer9r.r@r WhichOneof__getattribute__rdatajsonloads deserializerset_widget_metadatar )rFkwstatemetadatavalue_field_namer. deserializeds r7 __getitem__zWStates.__getitem__[s' # >1+  fe $<<  ''++A.  1+   LL # #G ,    LL ) )*: ;  %%5 6&++E  -JJtE512E,,U3    +  |, Ar6c"||j|<yrBr?rFrWvs r7 __setitem__zWStates.__setitem__s Ar6c|j|=yrBr^rFrWs r7 __delitem__zWStates.__delitem__s KKNr6c,t|jSrB)lenr?rEs r7__len__zWStates.__len__s4;;r6c#8K|jEd{y7wrBr^rEs r7__iter__zWStates.__iter__s;;s c,t|jSrB)rr?rEs r7keysz WStates.keyss $$r6c6|Dchc] }|||f c}Scc}wrBr5rcs r7itemsz WStates.itemss&*+DG +++sc2|Dchc]}|| c}Scc}wrBr5)rFwids r7valueszWStates.valuess%)*cS ***s c|jj|j|jj|jy)zCopy all widget values and metadata from 'other' into this mapping, overwriting any data in this mapping that's also present in 'other'. N)r?updater@rFothers r7rrzWStates.updates4 5<<( ##E$9$9:r6c4t|||j<y)zGSet a widget's serialized value, overwriting any existing value it has.N)r,id)rF widget_states r7set_widget_from_protozWStates.set_widget_from_protos *< 8\__r6c t|||<y)zISet a widget's deserialized value, overwriting any existing value it has.N)r9r_s r7set_from_valuezWStates.set_from_values(Qr6c6||j|j<y)zBSet a widget's metadata, overwriting any existing metadata it has.N)r@rv)rF widget_metas r7rVzWStates.set_widget_metadatas/:[^^,r6c |jjDcic].\}}t|jj |||s||0c}}|_ycc}}w)z&Remove widget state for stale widgets.N)r?rm_is_stale_widgetr@rM)rFactive_widget_idsfragment_ids_this_runrWr`s r7remove_stale_widgetszWStates.remove_stale_widgetssZ ))+ 1#$$((+!% qD   s3Ac|jj|}|yt|tr |jS|j j|}|yt }||_|j}|j|j}t|r)t||}|jj||S|dvr"t||tj ||S|dk(r|j"j%||S|dk(r|j&j%||S|dk(r|j(j%||S|| t||||S)zGet the serialized value of the widget with the given id. If the widget doesn't exist, return None. If the widget exists but is not in serialized form, it will be serialized first. N>rJjson_trigger_valuefile_uploader_state_valuestring_trigger_valuechat_input_value)r?rMrOr,r.r@r-rvrL serializerrgetattrrRextendsetattrrSdumpsrCopyFromrr)rFrWitemrYwidgetr serializedarrs r7get_serializedzWStates.get_serializedse{{q! < dJ ':: ''++A.  !# ##((4 $U +&%(C HHOOJ '  : : FE4::j#9 : 1 1  , , 5 5j A , ,  ' ' 0 0 < ( (  # # , ,Z 8  :#9 FE: . r6c|jDcgc]$}|j|r|j|&}}td|Scc}w)GReturn a list of serialized widget values for each widget with a value.list[WidgetStateProto])r?rr)rF widget_idr?s r7as_widget_stateszWStates.as_widget_statessS"[[ ""9-    *  ,f55  s)Ac(|jj|}|td|d|j}|y|jxsd}|j xsi}t }|r#|jd|_||i|d|_y||i|y)zCall the given widget's callback and return the callback's return value. If the widget has no callback, return None. If the widget doesn't exist, raise an Exception. NzWidget z not found.r5TF) r@rM RuntimeErrorcallback callback_argscallback_kwargsr fragment_idin_fragment_callback)rFrrYrargskwargsctxs r7 call_callbackzWStates.call_callbacks ''++I6   ;?@ @$$   %%+))/R " 8''3'+C $ d %f %',C $ d %f %r6NreturnrK)rWrKrr )rWrKr`r:rNone)rWrKrrrint)rz Iterator[str])rz KeysView[str])rzset[tuple[str, Any]])rzset[Any])rtr<rr)rwr-rr)rWrKr`r rr)r|WidgetMetadata[Any]rr)rset[str]rlist[str] | Nonerr)rWrKrzWidgetStateProto | Nonerr)rrKrr)r0r1r2r3r dictr?r4r@rGr\rardrgrirkrmrprrrxrzrVrrrrr5r6r7r<r<Ns !&d ;F ;6;D6QO3Q 1f  %,+;9; #  0    .`6&r6r<cd|dS)Nzst.session_state has no key "z". Did you forget to initialize it? More info: https://docs.streamlit.io/develop/concepts/architecture/session-state#initializationr5keys r7_missing_key_error_messagers 'u-j kr6ceZdZUdZeeZded<eeZded<ddZ ddZ ddZ e dd Z dd Zddd Zdd ZddZddZddZy ) KeyIdMappera#A mapping of user-provided keys to element IDs. It also maps element IDs to user-provided keys so that this reverse mapping does not have to be computed ad-hoc. All built-in dict-operations such as setting and deleting expect the key as the argument, not the element ID. r=dict[str, str]_key_id_mapping_id_key_mappingc||jvSrB)rrFrs r7 __contains__zKeyIdMapper.__contains__0sd****r6c@||j|<||j|<yrBrrrFrrs r7razKeyIdMapper.__setitem__3s"$-S!*-Y'r6c&|j|yrB)deleters r7rdzKeyIdMapper.__delitem__7s Cr6c|jSrBrrEs r7id_key_mappingzKeyIdMapper.id_key_mapping:s###r6cp||_|jDcic]\}}|| c}}|_ycc}}wrB)rrmr)rFkey_id_mappingrWr`s r7set_key_id_mappingzKeyIdMapper.set_key_id_mapping>s1-1?1E1E1GHA1HHs 2Nc:|jj||SrB)rrM)rFrdefaults r7get_id_from_keyzKeyIdMapper.get_id_from_keyBs##''W55r6c |j|SrBrrFrs r7get_key_from_idzKeyIdMapper.get_key_from_idEs##I..r6c|jj|j|jj|jyrB)rrrrrss r7rrzKeyIdMapper.updateHs6 ##E$9$9: ##E$9$9:r6cl|jj|jjyrB)rclearrrEs r7rzKeyIdMapper.clearLs& ""$ ""$r6cV|j|}|j|=|j|=yrBrrs r7rzKeyIdMapper.deletePs.((-   %   +r6rrKrbool)rrKrr rrrrKrr)rr)rrrrrB)rrKr str | Nonerr)rrKrrK)rtrrrrr)r0r1r2r3r rrr4rrrardpropertyrrrrrrrrr5r6r7rr$si',D&AO^A&+D&AO^A+.$$I6/;%,r6rceZdZUdZeeZded<eeZded<ee Z ded<ee Z ded <ee Zd ed <d.d Zd/d Zd/dZed0dZd1dZd2dZd3dZd4dZd5dZd6dZd7dZd8dZd9dZd:dZd;dZd/dZ ddZ#d?d Z$d/d!Z%d@d"Z&dAd#Z'dBd$Z(dCd%Z)dDd&Z*dEd'Z+ dFd(Z,dGd)Z-dHd*Z.d/d+Z/d/d,Z0y-)I SessionStateaSessionState allows users to store values that persist between app reruns. Example ------- >>> if "num_script_runs" not in st.session_state: ... st.session_state.num_script_runs = 0 >>> st.session_state.num_script_runs += 1 >>> st.write(st.session_state.num_script_runs) # writes 1 The next time your script runs, the value of st.session_state.num_script_runs will be preserved. >>> st.session_state.num_script_runs += 1 >>> st.write(st.session_state.num_script_runs) # writes 2 r=dict[str, Any] _old_state_new_session_stater<_new_widget_stater_key_id_mapperr" query_paramsc,tj|SrBrCrEs r7rGzSessionState.__repr__yrHr6c|D]} |||j|<|jj|jjy#t$rYXwxYw)zCopy all current session_state and widget_state values into our _old_state dict, and then clear our current session_state and widget_state. N)rrNrrr)rF key_or_wids r7_compact_statezSessionState._compact_state}sg  J .2:.> +  %%' $$&   sA AAc|jj|jj|jj|jjy)z;Reset self completely, clearing all current and old values.N)rrrrrrEs r7rzSessionState.clearsH  %%' $$& !!#r6c|jj}i}|jD]G}t|st |s ||||<"t |s.t |r: ||}||||<I|S#t $rYWwxYw)zVThe combined session and widget state, excluding keyless widgets and internal widgets.)rr_keysr_is_internal_keyr rN)rF wid_key_mapstaterWrs r7filtered_statezSessionState.filtered_states))88 "  A #,| | td| |j|S| |j|S| |j|S| |j|St#t$rYGwxYw#t$rYDwxYw#t$rYAwxYw#t$rYtwxYw)zGet the value of an entry in Session State, using either the user-provided key or a widget id as appropriate for the internal dict being accessed. At least one of the arguments must have a value. zEuser_key and widget_id cannot both be None. This should never happen.) ValueErrorrrNrrrFrrs r7rzSessionState._getitems   1W    ..x88   --i88   y11   x00 ;           sEAA-A< B  A*)A*- A98A9< BB BBct}|N|jj|d}|j}|j}||vs||vrt d|d|d||j |<y)zSet the value of the session_state entry with the given user_key. If the key corresponds to a widget or form that's been instantiated during the current script run, raise a StreamlitAPIException instead. Nz`st.session_state.z0` cannot be modified after the widget with key `z` is instantiated.)rrrwidget_ids_this_runform_ids_this_runrr)rFrr.rr widget_idsform_idss r7razSessionState.__setitem__s !" ?++;;HdKI00J,,HJ&(h*>+( 3""*+=? -2)r6c|j|}||vs||vstt|||jvr |j|=||jvr |j|=||j vr|j j |||jvr |j|=||jvr|j|=yyrB)rrNrrrrrrrs r7rdzSessionState.__delitem__#s'', t yD05c:; ; $)) )'', $// !$ $%% %    & &s + .. .&&y1  ' * (r6c\|jD]}|jj|y)zHSet the value of all widgets represented in the given WidgetStatesProto.N)widgetsrrx)rF widget_statesrs r7set_widgets_from_protoz#SessionState.set_widgets_from_proto8s-"** @E  " " 8 8 ? @r6c|j|j|j||jy)zCalled by ScriptRunner before its script re-runs. Update widget data and call callbacks on widgets whose value changed between the previous and current script runs. N)_reset_triggersrr_call_callbacks)rFlatest_widget_statess r7on_script_will_rerunz!SessionState.on_script_will_rerun=s7   ##$89 r6cddlm}|jDcgc]I}|j|r6|jjj |x} |j |K}}|D]} |jj| t|jjj}|D]}|jjj |}|r |j7|jxsd}|j xsi}|j#|||||j$dk(s{|j'||||ycc}w#|$r'tjjdYwxYw)zFCall callbacks for widgets whose value changed or whose trigger fired.rRerunExceptionN0Calling st.rerun() within a callback is a no-op.r5rJ)streamlit.runtime.scriptrunnerr r_widget_changedr@rMrrrmain_dgwarninglistr?rk callbacksrr_dispatch_trigger_callbacksrL_dispatch_json_change_callbacks)rFr rorY&changed_widget_ids_for_single_callbackwidget_ids_to_processrrs r7rzSessionState._call_callbacksIsA --2 ##C(!33CCGGLL!!- 2 .2 : C &&44S9 !%T%;%;%B%B%G%G%I J( RC--==AA#FHx119))/RD--3F  , ,S(D& I""l244S(D&Q R)2 " )+33;;F sAE +E(E:9E:cRddlm}t}|r$|jd|_ ||i|d|_y ||i|y#|$r&t j jdY>> metadata.callbacks = {"submit": on_submit} The frontend can send a single event payload: >>> {"event": "submit", "value": "payload"} Or a list of event payloads to be processed in order: >>> [{"event": "edit", ...}, {"event": "submit", ...}] Parameters ---------- wid : str The widget ID. metadata : WidgetMetadata[Any] Metadata for the widget, including registered callbacks. args : WidgetArgs Positional arguments forwarded to the callback. kwargs : dict[str, Any] Keyword arguments forwarded to the callback. Nevent) rrrrNrOrrrMrKrr) rFrorYrrwidget_proto_stater[payloadspayload event_namecbs r7rz(SessionState._dispatch_trigger_callbackssN"33BB3G!   0 0 $#55c: ,-'(># Vgt,!(W!5J!*c2x7I7I%//33J?> 99"hfU  V 1 $#  $sC CCc|jsy |jj|}|jj|}dd}||}||} |s| r|j | j z} | D chc](} | j| |j| k7s'| *} } | D]4} |jj| }|!|j ||||6yy#t$rd}YwxYwcc} w)a8Dispatch change callbacks for JSON-valued widgets. Computes a shallow diff between the new and old JSON maps and invokes callbacks for keys that changed or were added/removed. Parameters ---------- wid : str The widget ID. metadata : WidgetMetadata[Any] Metadata for the widget, including registered callbacks. args : WidgetArgs Positional arguments forwarded to the callback. kwargs : dict[str, Any] Keyword arguments forwarded to the callback. Nct|tsiStd|}t|j dhk(r,|j d}t|tr t|St|S)Nrr.)rOrrrrkrM)objr.s r7unwrapz.unwraps^c4( '-C388:7)+(eT*;&9 r6)r'objectrzdict[str, object])rrrMrNrrkr)rFrorYrrnew_valold_valr(new_mapold_mapall_keysrW changed_keysrr$s r7rz,SessionState._dispatch_json_change_callbackss.!!  ,,005G//%%c* // g||~ 6H'/T!7;;q>W[[QR^3SATLT# N''++C0>11"hfM N ' G *UsC,(C=+C=, C:9C:c||jj|}|jj|}||k7}|S)zuTrue if the given widget's value changed between the previous script run and the current script run. )rrMr)rFr new_value old_valuechangeds r7rzSessionState._widget_changeds=**..y9 OO'' 2 !Y.r6cF|j|j|y)aCalled by ScriptRunner after its script finishes running. Updates widgets to prepare for the next script run. Parameters ---------- widget_ids_this_run: set[str] The IDs of the widgets that were accessed during the script run. Any widget state whose ID does *not* appear in this set is considered "stale" and will be removed. N)r_remove_stale_widgets)rFrs r7on_script_finishedzSessionState.on_script_finished s  ""#67r6c|jD]y}|jjj|}|+|jdk(rt d|j|<S|jdvsbt d|j|<{|j D]g}|jjj|}|+|jdk(rd|j |<J|jdvsYd|j |<iy)z8Set all trigger values in our state dictionary to False.N trigger_valueF>rrr)rr@rMrLr9r)rFstate_idrYs r7rzSessionState._reset_triggers.s.. CH--==AA(KH#&&/97>qA%-- qD    sAB-cL|jjj|S)zBReturn the metadata for a widget id from the current widget state.)rr@rMrs r7_get_widget_metadataz!SessionState._get_widget_metadatabs%%5599)DDr6cN|j}||jj|<y)zSet a widget's metadata.N)rvrr@)rFr@rs r7_set_widget_metadataz!SessionState._set_widget_metadatafs##&& >q!DEEr6c"||j|<yrB)rrs r7_set_key_widget_mappingz$SessionState._set_key_widget_mappingws(1H%r6cd|j}|j|||j||||vr?|||vr9|j}t |d}|j j ||td||}t |}|duxr|j|}t||S)aRegister a widget with the SessionState. Returns ------- RegisterWidgetResult[T] Contains the widget's current value, and a bool that will be True if the frontend needs to be updated with the current value. Nr) rvr>rCrUrrrzrrr)rFrYrrrUinitial_widget_value widget_valuewidget_value_changeds r7register_widgetzSessionState.register_widgetzsKK  !!(+    ( (H = D h&6($:N$00L#+L,>#?  " " 1 1)=Q R Ci1  -  (t3 8O8O 9 $L2FGGr6c. ||y#t$rYywxYw)NTF)rNrs r7rzSessionState.__contains__s'  I  s  c:ddlm}tdd||}|gS)Nr)asizeofst_session_state) streamlit.vendor.pympler.asizeofrKr#)rFrKstats r7 get_statszSessionState.get_statss<+R?v r6c|D]} tj||y#t$r&}dt||d|d}t ||d}~wwxYw)zVerify that everything added to session state can be serialized. We use pickleability as the metric for serializability, and test for pickleability by just trying it. z%Cannot serialize the value (of type `z`) of 'aV' in st.session_state. Streamlit has been configured to use [pickle](https://docs.python.org/3/library/pickle.html) to serialize session_state values. Please convert the value to a pickle-serializable type. To learn more about this behavior, see [our docs](https://docs.streamlit.io/knowledge-base/using-streamlit/serializable-session-state).N)pickler Exceptiontyper)rFrWeerr_msgs r7_check_serializablez SessionState._check_serializablesw  FA F T!W% F F;DaM?'RSQTU{{6g>AE Fs" A!A  AcPtjdr|jyy)zVerify that session state can be serialized, if the relevant config option is set. See `_check_serializable` for details. z&runner.enforceSerializableSessionStateN)r get_optionrWrEs r7maybe_check_serializablez%SessionState.maybe_check_serializables%   E F  $ $ & Gr6Nrr)rr)rr)rrKrr)rrKr.z Any | Nonerr)rz Iterator[Any]r)rrKrr )rrrrrr )rrKr.r rrr)rWidgetStatesProtorr)rr[rr) rrrrrrrrrr) rorKrYrrrrrrr)rrKrr)rrrr)rrrr)rrKrWidgetMetadata[Any] | None)r@rrrr)rWrKrrK)rrKrrKrr)rYzWidgetMetadata[T]rrrzRegisterWidgetResult[T]rrzlist[CacheStat])1r0r1r2r3r rrr4rr<rrrr"rrGrrrrrrrrirgr\rrardrr rrrrrr6rr5r<r>r@rrCrHrrPrWrZr5r6r7rrVs""'t!V >V&>V >V  >V  >V@6N 6N&6N 6N  6N  6Np 854 4EL 9F2%H)%H5?%H %HNF&'r6rc,|jtSrB) startswithr'rs r7rrs >>7 88r6cN|sy|j|vxs|xr|j|v S)NT)rvr)rYrrs r7r~r~s=   (( Y ! Wh&:&:BW&W r6c eZdZUded<ddZy)SessionStateStatProviderr& _session_mgrcg}|jjD]7}|jj}|j |j 9t |SrB)rclist_active_sessionssession session_staterrPr%)rFstats session_inforgs r7rPz"SessionStateStatProvider.get_statssX!# --BBD 4L(00>>M LL002 3 45!!r6Nr])r0r1r2r4rPr5r6r7rbrbs   "r6rb)rrKrrKr)rYr\rrrrrr)E __future__rrSrRcollections.abcrrrcopyr dataclassesrr r typingr r r rr streamlitrr$streamlit.delta_generator_singletonsrstreamlit.errorsrr streamlit.proto.WidgetStates_pb2rr-rr[7streamlit.runtime.scriptrunner_utils.script_run_contextrstreamlit.runtime.state.commonrrrrrrrrr $streamlit.runtime.state.presentationr!$streamlit.runtime.state.query_paramsr"streamlit.runtime.statsr#r$r%!streamlit.runtime.session_managerr&r'r4r)r,r9r:rKr<rrrrr~rbr5r6r7rys# >>11#JSLNV   A<NN@(BuA$%%?@u  $  $ J& & K&nS#X&K& K&\ .,., .,b s 's ' s 'l9(, " "1" "r6