소스 검색

raise meaningful exception when mixing positional and keyword arguments for refreshable UI

Falko Schindler 1 년 전
부모
커밋
4701dd3c1e
2개의 변경된 파일15개의 추가작업 그리고 1개의 파일을 삭제
  1. 9 1
      nicegui/functions/refreshable.py
  2. 6 0
      tests/test_refreshable.py

+ 9 - 1
nicegui/functions/refreshable.py

@@ -76,7 +76,15 @@ class refreshable:
             target.container.clear()
             target.args = args or target.args
             target.kwargs.update(kwargs)
-            result = target.run(self.func)
+            try:
+                result = target.run(self.func)
+            except TypeError as e:
+                if 'got multiple values for argument' in str(e):
+                    function = str(e).split()[0]
+                    parameter = str(e).split()[-1]
+                    raise Exception(f'{parameter} needs to be consistently passed to {function} '
+                                    'either as positional or as keyword argument') from e
+                raise
             if is_coroutine_function(self.func):
                 assert result is not None
                 if globals.loop and globals.loop.is_running():

+ 6 - 0
tests/test_refreshable.py

@@ -114,6 +114,7 @@ def test_refresh_with_arguments(screen: Screen):
     ui.button('refresh()', on_click=lambda: some_ui.refresh())
     ui.button('refresh(1)', on_click=lambda: some_ui.refresh(1))
     ui.button('refresh(2)', on_click=lambda: some_ui.refresh(2))
+    ui.button('refresh(value=3)', on_click=lambda: some_ui.refresh(value=3))
 
     screen.open('/')
     screen.should_contain('count=1, value=0')
@@ -130,6 +131,11 @@ def test_refresh_with_arguments(screen: Screen):
     screen.click('refresh(2)')
     screen.should_contain('count=5, value=2')
 
+    screen.click('refresh(value=3)')
+    screen.assert_py_logger('ERROR',
+                            "'value' needs to be consistently passed to test_refresh_with_arguments.<locals>.some_ui() "
+                            "either as positional or as keyword argument")
+
 
 def test_refresh_deleted_element(screen: Screen):
     @ui.refreshable