135135
136136def check_name (name ):
137137 assert all (i in _html_value_chars for i in name ), "pin `name` can only contain letters, digits and underscore"
138+ assert name != 'use_strict' , "'use_strict' is a reserve name, can't use as pin widget name"
138139 assert name [0 ] in string .ascii_letters , "pin `name` can only starts with letters"
139140
140141
@@ -224,20 +225,30 @@ def put_actions(name, *, label='', buttons=None, help_text=None,
224225
225226
226227@chose_impl
227- def get_client_val ():
228+ def get_client_val (strict = False ):
228229 res = yield next_client_event ()
229230 assert res ['event' ] == 'js_yield' , "Internal Error, please report this bug on " \
230231 "https://github.com/wang0618/PyWebIO/issues"
231- return res ['data' ]
232+ data = res ['data' ]
233+ assert not strict or data , 'pin widget doesn\' t exist.'
234+ return (data or {}).get ('value' )
232235
233236
234237class Pin_ :
238+ _strict = False
239+
240+ def use_strict (self ):
241+ """
242+ Enable strict mode for getting pin widget value.
243+ An AssertionError will be raised when try to get value of pin widgets that are currently not in the page.
244+ """
245+ self ._strict = True
235246
236247 def __getattr__ (self , name ):
237248 """__getattr__ is only invoked if the attribute wasn't found the usual ways"""
238249 check_name (name )
239250 send_msg ('pin_value' , spec = dict (name = name ))
240- return get_client_val ()
251+ return get_client_val (self . _strict )
241252
242253 def __getitem__ (self , name ):
243254 return self .__getattr__ (name )
@@ -246,6 +257,9 @@ def __setattr__(self, name, value):
246257 """
247258 __setattr__ will be invoked regardless of whether the attribute be found
248259 """
260+ if name == '_strict' :
261+ return object .__setattr__ (self , name , value )
262+
249263 check_name (name )
250264 send_msg ('pin_update' , spec = dict (name = name , attributes = {"value" : value }))
251265
0 commit comments