Skip to content
Open
Show file tree
Hide file tree
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
52 changes: 27 additions & 25 deletions addin/xlpython/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,40 +19,40 @@ def inner(f):
if f.__code__.co_flags & 4: # function has an '*args' argument
nArgs += 1
for vpos, vname in enumerate(f.__code__.co_varnames[:nArgs]):
xlargs.append({
"name": vname,
"pos": vpos,
"marshal": "var",
"vba": None,
"range": False,
"dtype": None,
"dims": -1,
"doc": "Positional argument " + str(vpos+1),
"vararg": True if vpos == f.__code__.co_argcount else False
})
xlargs.append(
{
"name": vname,
"pos": vpos,
"marshal": "var",
"vba": None,
"range": False,
"dtype": None,
"dims": -1,
"doc": f"Positional argument {str(vpos + 1)}",
"vararg": vpos == f.__code__.co_argcount,
}
)
xlargmap[vname] = xlargs[-1]
xlf["ret"] = {
"marshal": "var",
"lax": True,
"doc": f.__doc__ if f.__doc__ is not None else "Python function '" + f.__name__ + "' defined in '" + str(f.__code__.co_filename) + "'."
"doc": f.__doc__
if f.__doc__ is not None
else f"Python function '{f.__name__}' defined in '{str(f.__code__.co_filename)}'.",
}
return f
if f is None:
return inner
else:
return inner(f)

return inner if f is None else inner(f)

def xlsub(f = None, **kwargs):
def inner(f):
f = xlfunc(**kwargs)(f)
f.__xlfunc__["sub"] = True
return f
if f is None:
return inner
else:
return inner(f)

xlretparams = set(("marshal", "lax", "doc"))
return inner if f is None else inner(f)

xlretparams = {"marshal", "lax", "doc"}
def xlret(marshal=None, **kwargs):
if marshal is not None:
kwargs["marshal"] = marshal
Expand All @@ -63,11 +63,12 @@ def inner(f):
if k in xlretparams:
xlr[k] = v
else:
raise Exception("Invalid parameter '" + k + "'.")
raise Exception(f"Invalid parameter '{k}'.")
return f

return inner

xlargparams = set(("marshal", "dims", "dtype", "range", "doc", "vba"))
xlargparams = {"marshal", "dims", "dtype", "range", "doc", "vba"}
def xlarg(arg, marshal=None, dims=None, **kwargs):
if marshal is not None:
kwargs["marshal"] = marshal
Expand All @@ -76,14 +77,15 @@ def xlarg(arg, marshal=None, dims=None, **kwargs):
def inner(f):
xlf = xlfunc(f).__xlfunc__
if arg not in xlf["argmap"]:
raise Exception("Invalid argument name '" + arg + "'.")
raise Exception(f"Invalid argument name '{arg}'.")
xla = xlf["argmap"][arg]
for k, v in kwargs.items():
if k in xlargparams:
xla[k] = v
else:
raise Exception("Invalid parameter '" + k + "'.")
raise Exception(f"Invalid parameter '{k}'.")
return f

return inner

udf_scripts = {}
Expand Down
23 changes: 5 additions & 18 deletions addin/xlpython/xlpyserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ def ShowConsole(self):

def Module(self, module, reload=False):
vars = {}
exec("import " + module + " as the_module", vars)
exec(f"import {module} as the_module", vars)
m = vars["the_module"]
if reload:
m = __builtins__.reload(m)
Expand All @@ -122,7 +122,7 @@ def DictFromArray(self, kvpairs):
def Dict(self, *kvpairs):
if len(kvpairs) % 2 != 0:
raise Exception("Arguments must be alternating keys and values.")
n = int(len(kvpairs) / 2)
n = len(kvpairs) // 2
d = {}
for k in range(n):
key = FromVariant(kvpairs[2*k])
Expand All @@ -134,7 +134,7 @@ def ListFromArray(self, elements):
return self.List(*elements)

def List(self, *elements):
return ToVariant(list((FromVariant(e) for e in elements)))
return ToVariant([FromVariant(e) for e in elements])

def Obj(self, var, dispatch=True):
return ToVariant(FromVariant(var, dispatch))
Expand All @@ -150,12 +150,7 @@ def Var(self, obj, lax=False):
value = tuple(value.items())
elif t.__name__ == 'ndarray' and t.__module__ == 'numpy':
value = value.tolist()
if type(value) is tuple:
return (value,)
# elif isinstance(value, types.InstanceType) and value.__class__ is win32com.client.CDispatch:
# return value._oleobj_
else:
return value
return (value, ) if type(value) is tuple else value

def Call(self, obj, *args):
obj = FromVariant(obj)
Expand All @@ -181,11 +176,7 @@ def Len(self, obj):
return len(obj)

def Bool(self, obj):
obj = FromVariant(obj)
if obj:
return True
else:
return False
return bool(obj := FromVariant(obj))

def Builtin(self):
import __builtin__
Expand Down Expand Up @@ -239,8 +230,6 @@ def Eval(self, expr, *args):
locals = arg
else:
raise Exception("Eval can be called with at most 2 dictionary arguments")
else:
pass
return ToVariant(eval(expr, globals, locals))

def Exec(self, stmt, *args):
Expand All @@ -255,8 +244,6 @@ def Exec(self, stmt, *args):
locals = arg
else:
raise Exception("Exec can be called with at most 2 dictionary arguments")
else:
pass
exec(stmt, globals, locals)

# --- ovveride CreateInstance in default policy to instantiate the XLPython object ---
Expand Down