SORU
12 HAZİRAN 2009, Cuma


Dönüştürme Sözlük için bir Dize?

Nasıl bir str gösterimine dönüştürmek dict bir dizeye aşağıdaki gibi dict, alabilir miyim?

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

eval kullanmamayı tercih ederim. Başka ne kullanabilirim?

Bunun ana nedeni, yazdığı arkadaşları derslerimden biri, dizeler içine her giriş dönüştürür. Gidip derslerini değiştirmek için ruh hali içinde, bu konu ile ilgili değilim.

CEVAP
12 HAZİRAN 2009, Cuma


Python 2.6 başlayarak yerleşik ast.literal_eval: kullanabilirsiniz

>>> import ast
>>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}")
{'muffin': 'lolz', 'foo': 'kitty'}

Bu eval kullanmaktan daha güvenlidir. Kendi docs dediği gibi:

>>> help(ast.literal_eval)
Help on function literal_eval in module ast:

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.

Örneğin:

>>> eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 208, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "/opt/Python-2.6.1/lib/python2.6/shutil.py", line 206, in rmtree
    names = os.listdir(path)
OSError: [Errno 2] No such file or directory: 'mongo'
>>> ast.literal_eval("shutil.rmtree('mongo')")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/opt/Python-2.6.1/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012
  • Showtime

    Showtime

    21 HAZİRAN 2006