Skip to content

Commit 3cdf975

Browse files
committed
move callback arg parsing into dependencies.py
1 parent 6edd176 commit 3cdf975

File tree

2 files changed

+42
-42
lines changed

2 files changed

+42
-42
lines changed

dash/dash.py

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
from .fingerprint import build_fingerprint, check_fingerprint
2525
from .resources import Scripts, Css
26-
from .dependencies import Input, Output, State
26+
from .dependencies import handle_callback_args
2727
from .development.base_component import ComponentRegistry
2828
from .exceptions import PreventUpdate, InvalidResourceError, ProxyError
2929
from .version import __version__
@@ -101,45 +101,6 @@ class _NoUpdate(object):
101101
"""
102102

103103

104-
def extract_callback_args(args, kwargs, name, type_):
105-
"""Extract arguments for callback from a name and type"""
106-
print(args, kwargs)
107-
parameters = kwargs.get(name, [])
108-
if not parameters:
109-
while args and isinstance(args[0], type_):
110-
parameters.append(args.pop(0))
111-
return parameters
112-
113-
114-
def _handle_callback_args(*args, **kwargs):
115-
"""Split args into outputs, inputs and states"""
116-
prevent_initial_call = kwargs.get("prevent_initial_call", None)
117-
# flatten args
118-
args = [
119-
arg
120-
# for backward compatibility, one arg can be a list
121-
for arg_or_list in args
122-
# flatten args that are lists
123-
for arg in (
124-
arg_or_list if isinstance(arg_or_list, (list, tuple)) else [arg_or_list]
125-
)
126-
]
127-
outputs = extract_callback_args(args, kwargs, "output", Output)
128-
inputs = extract_callback_args(args, kwargs, "inputs", Input)
129-
states = extract_callback_args(args, kwargs, "state", State)
130-
131-
if args:
132-
raise TypeError(
133-
"callback must received first all Outputs, then all Inputs, then all States"
134-
)
135-
return [
136-
outputs,
137-
inputs,
138-
states,
139-
prevent_initial_call,
140-
]
141-
142-
143104
# pylint: disable=too-many-instance-attributes
144105
# pylint: disable=too-many-arguments, too-many-locals
145106
class Dash(object):
@@ -955,7 +916,7 @@ def clientside_callback(self, clientside_function, *args, **kwargs):
955916
state,
956917
callback_args,
957918
prevent_initial_call,
958-
) = _handle_callback_args(args, kwargs)
919+
) = handle_callback_args(args, kwargs)
959920
self._insert_callback(output, inputs, state, callback_args)
960921

961922
# If JS source is explicitly given, create a namespace and function
@@ -1004,7 +965,7 @@ def callback(self, *args, **kwargs):
1004965
# for backward compatibility, store whether first argument is a
1005966
# list of only 1 Output
1006967
specified_output_list = isinstance(output, (list, tuple)) and len(output) == 1
1007-
(output, inputs, state, prevent_initial_call,) = _handle_callback_args(
968+
(output, inputs, state, prevent_initial_call,) = handle_callback_args(
1008969
*args, **kwargs
1009970
)
1010971
callback_id = self._insert_callback(output, inputs, state, prevent_initial_call)

dash/dependencies.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,42 @@ def __init__(self, namespace=None, function_name=None):
133133

134134
def __repr__(self):
135135
return "ClientsideFunction({}, {})".format(self.namespace, self.function_name)
136+
137+
138+
def extract_callback_args(args, kwargs, name, type_):
139+
"""Extract arguments for callback from a name and type"""
140+
print(args, kwargs)
141+
parameters = kwargs.get(name, [])
142+
if not parameters:
143+
while args and isinstance(args[0], type_):
144+
parameters.append(args.pop(0))
145+
return parameters
146+
147+
148+
def handle_callback_args(*args, **kwargs):
149+
"""Split args into outputs, inputs and states"""
150+
prevent_initial_call = kwargs.get("prevent_initial_call", None)
151+
# flatten args
152+
args = [
153+
arg
154+
# for backward compatibility, one arg can be a list
155+
for arg_or_list in args
156+
# flatten args that are lists
157+
for arg in (
158+
arg_or_list if isinstance(arg_or_list, (list, tuple)) else [arg_or_list]
159+
)
160+
]
161+
outputs = extract_callback_args(args, kwargs, "output", Output)
162+
inputs = extract_callback_args(args, kwargs, "inputs", Input)
163+
states = extract_callback_args(args, kwargs, "state", State)
164+
165+
if args:
166+
raise TypeError(
167+
"callback must received first all Outputs, then all Inputs, then all States"
168+
)
169+
return [
170+
outputs,
171+
inputs,
172+
states,
173+
prevent_initial_call,
174+
]

0 commit comments

Comments
 (0)