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

  • Associated Press

    Associated P

    18 EYLÜL 2006
  • captainpuppys2000

    captainpuppy

    20 HAZİRAN 2013
  • fouseyTUBE

    fouseyTUBE

    21 Mart 2011