def auto_positive_symbol(tokens, local_dict, global_dict):
"""
Inserts calls to ``Symbol`` for undefined variables.
Passes in positive=True as a keyword argument.
Adapted from sympy.sympy.parsing.sympy_parser.auto_symbol
"""
result = []
prevTok = (None, None)
tokens.append((None, None)) # so zip traverses all tokens
for tok, nextTok in zip(tokens, tokens[1:]):
tokNum, tokVal = tok
nextTokNum, nextTokVal = nextTok
if tokNum == token.NAME:
name = tokVal
if (name in ['True', 'False', 'None']
or iskeyword(name)
or name in local_dict
# Don't convert attribute access
or (prevTok[0] == token.OP and prevTok[1] == '.')
# Don't convert keyword arguments
or (prevTok[0] == token.OP and prevTok[1] in ('(', ',')
and nextTokNum == token.OP and nextTokVal == '=')):
result.append((token.NAME, name))
continue
elif name in global_dict:
obj = global_dict[name]
if isinstance(obj, (Basic, type)) or callable(obj):
result.append((token.NAME, name))
continue
result.extend([
(token.NAME, 'Symbol'),
(token.OP, '('),
(token.NAME, repr(str(name))),
(token.OP, ','),
(token.NAME, 'positive'),
(token.OP, '='),
(token.NAME, 'True'),
(token.OP, ')'),
])
else:
result.append((tokNum, tokVal))
prevTok = (tokNum, tokVal)
return result
评论列表
文章目录