Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def visit_Subscript(self, node):
node = self.generic_visit(node)
s = node.slice
if not isinstance(s, gast.Index):
# TODO(mdan): Support range and multi-dimensional indices.
# Continuing silently because some demos use these.
return node
if isinstance(s.value, gast.Num):
subscript = QN(NumberLiteral(s.value.n))
elif isinstance(s.value, gast.Str):
subscript = QN(StringLiteral(s.value.s))
else:
subscript = anno.getanno(node.slice.value, anno.Basic.QN)
if anno.hasanno(node.value, anno.Basic.QN):
anno.setanno(node, anno.Basic.QN,
QN(anno.getanno(node.value, anno.Basic.QN),
subscript=subscript))
return node
def visit_Subscript(self, node):
"""Turn a Python Subscript node into JavaScript code."""
value = self.visit(node.value)
if isinstance(node.slice, ast.Index):
return '{value}[{index}]'.format(
value=value,
index=self.visit(node.slice.value)
)
raise Py2JSSyntaxError('Unsupported {} node'.format(node.slice.__class__.__name__))
return_alias=lambda args: {
ast.Subscript(args[0],
ast.Index(args[1]),
ast.Load())
}.union({args[2]} if len(args) == 3 else set())
),
def ast(self):
# The caller must adjust the context appropriately.
if self.has_subscript():
return gast.Subscript(self.parent.ast(), gast.Index(self.qn[-1].ast()),
None)
if self.has_attr():
return gast.Attribute(self.parent.ast(), self.qn[-1], None)
base = self.qn[0]
if isinstance(base, str):
return gast.Name(base, None, None)
elif isinstance(base, StringLiteral):
return gast.Str(base.value)
elif isinstance(base, NumberLiteral):
return gast.Num(base.value)
else:
assert False, ('the constructor should prevent types other than '
'str, StringLiteral and NumberLiteral')
def visit_Subscript(self, node):
if isinstance(node.value, (gast.Name, gast.Num)) and node.value.id == 'd':
if (not isinstance(node.slice, gast.Index) or
not isinstance(node.slice.value,
(gast.Subscript, gast.Name, gast.Str))):
# This happens when the gradient of a constant is taken
if self.replace_grad == Replace.TANGENT:
new_node = gast.Num(0)
else:
new_node = gast.Name(id='_', ctx=None, annotation=None)
self.remove(new_node)
elif (self.replace_grad in (Replace.FULL, Replace.TANGENT) or
isinstance(node.ctx, gast.Load)):
new_node = create.create_grad(node.slice.value, self.namer,
self.tangent)
elif isinstance(node.ctx, gast.Store):
new_node = create.create_temp_grad(node.slice.value, self.namer,
self.tangent)
else:
if isinstance(self, gast.Slice):
assert self.step is None
def f(x, v):
if x is None:
return Value(v).to_tensor(env)
x = eval_ast(x, env)
if istensor(x):
return x
else:
return x.to_tensor(env)
lower = unsqueeze(f(self.lower, 0))
# TODO(satos) その場しのぎっぽいのでどうにかする(けどこれどうにもならないですよね...?)
upper = unsqueeze(f(self.upper, int_max))
squeeze = [False]
elif isinstance(self, gast.Index):
idx = eval_ast(self.value, env)
if isinstance(idx.value, tuple): # ここにTupleが来うる
# TODO(satos) もっとうまくやったほうがいいかも
vs = [gast.Index(gast.NameConstant(value=v)) for v in idx.value]
lower, upper, squeeze = slice2list(gast.ExtSlice(dims=vs))
elif not idx.is_py:
lower = unsqueeze(idx.value)
ot = totensor(1, env)
upper = env.calc(
"Add",
inputs=[idx.to_tensor(env).name, ot.name],
)
upper = unsqueeze(upper)
squeeze = [True]
else:
lower = unsqueeze(totensor(idx.value, env))
if x is None:
return Value(v).to_tensor(env)
x = eval_ast(x, env)
if istensor(x):
return x
else:
return x.to_tensor(env)
lower = unsqueeze(f(self.lower, 0))
# TODO(satos) その場しのぎっぽいのでどうにかする(けどこれどうにもならないですよね...?)
upper = unsqueeze(f(self.upper, int_max))
squeeze = [False]
elif isinstance(self, gast.Index):
idx = eval_ast(self.value, env)
if isinstance(idx.value, tuple): # ここにTupleが来うる
# TODO(satos) もっとうまくやったほうがいいかも
vs = [gast.Index(gast.NameConstant(value=v)) for v in idx.value]
lower, upper, squeeze = slice2list(gast.ExtSlice(dims=vs))
elif not idx.is_py:
lower = unsqueeze(idx.value)
ot = totensor(1, env)
upper = env.calc(
"Add",
inputs=[idx.to_tensor(env).name, ot.name],
)
upper = unsqueeze(upper)
squeeze = [True]
else:
lower = unsqueeze(totensor(idx.value, env))
upper_value = idx.value + 1 if idx.value != -1 else int_max
upper = unsqueeze(totensor(upper_value, env))
squeeze = [True]
elif isinstance(self, gast.ExtSlice):
def parametrize(exp):
# constant(?) or global -> no change
if isinstance(exp, (ast.Index, Intrinsic, ast.FunctionDef)):
return lambda _: {exp}
elif isinstance(exp, ContainerOf):
pcontainee = parametrize(exp.containee)
index = exp.index
return lambda args: {
ContainerOf(pc, index)
for pc in pcontainee(args)
}
elif isinstance(exp, ast.Name):
try:
w = node.args.args.index(exp)
def return_alias(args):
if w < len(args):
return {args[w]}
else:
)
new_value_type = TypeVariable()
for value in node.values:
value_type = analyse(value, env, non_generic)
try:
unify(new_value_type, value_type)
except InferenceError:
raise PythranTypeError(
"Incompatible dict value type `{}` and `{}`".format(
new_value_type, value_type),
node
)
return Dict(new_key_type, new_value_type)
elif isinstance(node, gast.Tuple):
return Tuple([analyse(elt, env, non_generic) for elt in node.elts])
elif isinstance(node, gast.Index):
return analyse(node.value, env, non_generic)
elif isinstance(node, gast.Slice):
def unify_int_or_none(t, name):
try:
unify(t, Integer())
except InferenceError:
try:
unify(t, NoneType)
except InferenceError:
raise PythranTypeError(
"Invalid slice {} type `{}`, expecting int or None"
.format(name, t)
)
if node.lower:
lower_type = analyse(node.lower, env, non_generic)
unify_int_or_none(lower_type, 'lower bound')