Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions js2py/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def MakeError(name, message):
return JsToPyException(ERRORS[name](Js(message)))


def to_python(val):
def to_python(val, force=False):
if not isinstance(val, PyJs):
return val
if isinstance(val, PyJsUndefined) or isinstance(val, PyJsNull):
Expand All @@ -55,6 +55,16 @@ def to_python(val):
return to_list(val)
elif isinstance(val, PyJsObject) and val.CONVERT_TO_PY_PRIMITIVES:
return to_dict(val)
elif force:
if val.is_primitive() or val.is_callable():
return val
# TODO: Maybe support numpy in the future
if val.Class in ('Array', 'Int8Array', 'Uint8Array',
'Uint8ClampedArray', 'Int16Array',
'Uint16Array', 'Int32Array', 'Uint32Array',
'Float32Array', 'Float64Array', 'Arguments'):
return to_list(val)
return to_dict(val)
else:
return JsObjectWrapper(val)

Expand Down Expand Up @@ -120,7 +130,7 @@ def HJs(val):

@Js
def PyWrapper(this, arguments, var=None):
args = tuple(to_python(e) for e in arguments.to_list())
args = tuple(to_python(e, True) for e in arguments.to_list())
try:
py_res = val.__call__(*args)
except Exception as e:
Expand Down Expand Up @@ -963,6 +973,14 @@ def __repr__(self):
return '{%s}' % ', '.join(res)
elif self.Class == 'String':
return str_repr(self.value)
elif self.Class == 'Number':
return self.to_string().value
elif self.Class == 'Boolean':
return self.to_string().value
elif self.Class == 'Null':
return 'null'
elif self.Class == 'Undefined':
return 'undefined'
elif self.Class in [
'Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray',
'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array',
Expand Down Expand Up @@ -1299,7 +1317,7 @@ def put(self, prop, val, op=None, throw=False):
return val

def __call__(self, *args):
py_args = tuple(to_python(e) for e in args)
py_args = tuple(to_python(e, True) for e in args)
try:
py_res = self.obj.__call__(*py_args)
except Exception as e:
Expand All @@ -1312,7 +1330,7 @@ def __call__(self, *args):
return py_wrap(py_res)

def callprop(self, prop, *args):
py_args = tuple(to_python(e) for e in args)
py_args = tuple(to_python(e, True) for e in args)
if not isinstance(prop, basestring):
prop = prop.to_string().value
return self.get(prop)(*py_args)
Expand Down