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

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • curioustravelers

    curioustrave

    12 AĞUSTOS 2006
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007