tutun. girişinizi güvenilmeyen ise
, o zaman sterilize olması gerekiyor.
Bir makul yaklaşım regex kullanılmasıdır. Dizede işlev çağrıları, özellik aramaları veya çift alt çizgiler olmadığından emin olun. Alternatif olarak, daha karmaşık bir yaklaşım, AST ayrıştırma ağacında herhangi bir sakıncalı çağrı olup olmadığını belirlemek için yürümektir.
üçüncü bir yaklaşım AST ayrıştırma ağacı yürümek ve doğrudan yürütmektir. Bu size çağrıların ne olduğu konusunda tam bir kontrol sağlar. Ast.literal_eval işlevi bu yaklaşımı alır.Belki de kaynağından başlayıp destek olmak istediğiniz herhangi bir işlem için bazı geliştirmeler yapın:
def literal_eval(node_or_string):
"""
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
and None.
"""
_safe_names = {'None': None, 'True': True, 'False': False}
if isinstance(node_or_string, basestring):
node_or_string = parse(node_or_string, mode='eval')
if isinstance(node_or_string, Expression):
node_or_string = node_or_string.body
def _convert(node):
if isinstance(node, Str):
return node.s
elif isinstance(node, Num):
return node.n
elif isinstance(node, Tuple):
return tuple(map(_convert, node.elts))
elif isinstance(node, List):
return list(map(_convert, node.elts))
elif isinstance(node, Dict):
return dict((_convert(k), _convert(v)) for k, v
in zip(node.keys, node.values))
elif isinstance(node, Name):
if node.id in _safe_names:
return _safe_names[node.id]
elif isinstance(node, BinOp) and \
isinstance(node.op, (Add, Sub)) and \
isinstance(node.right, Num) and \
isinstance(node.right.n, complex) and \
isinstance(node.left, Num) and \
isinstance(node.left.n, (int, long, float)):
left = node.left.n
right = node.right.n
if isinstance(node.op, Add):
return left + right
else:
return left - right
raise ValueError('malformed string')
return _convert(node_or_string)
Çözmeyi denediğiniz problem nedir? Bir gp okuma-yorumlama döngüsü mi yapıyorsunuz? – starbolin