Наследование конструкторов означает именно это. Производный класс может неявно наследовать конструкторы из своего базового класса (es).
Синтаксис выглядит следующим образом:
struct B
{
B(int); // normal constructor 1
B(string); // normal constructor 2
};
struct D : B
{
using B::B; // inherit constructors from B
};
Итак, теперь D имеет неявно определенные конструкторы:
D::D(int); // inherited
D::D(string); // inherited
Члены Ds по умолчанию сконструированы этими наследуемыми конструкторами.
Как будто конструкторы были определены следующим образом:
D::D(int x) : B(x) {}
D::D(string s) : B(s) {}
Функция isn ' t ничего особенного. Это всего лишь сокращение, чтобы сохранить печатный код шаблона.
Вот подробные сведения:
12.9 Наследование конструкторов
1) Использование-декларация который называет конструктор, неявно объявляет набор наследующих конструкторов. Набор кандидатов унаследованных конструкторов из класса X, указанный в объявлении using, состоит из фактических конструкторов и условных конструкторов, которые являются результатом преобразования дефолтных параметров следующим образом:
blockquote>
- все конструкторы без шаблонов X и
- для каждого конструктора без шаблона для X, который имеет по крайней мере один параметр с аргументом по умолчанию, набор конструкторов, который возникает из-за отсутствия какой-либо спецификации параметра многоточия и последовательного исключения параметров с аргументом по умолчанию из конец списка параметров-типа и
- все шаблоны конструктора X и
- для каждого шаблона конструктора X, который имеет хотя бы один параметр с аргументом по умолчанию, набор шаблонов конструктора, который возникает из-за отсутствия какой-либо спецификации параметра эллипсиса и последовательного исключения параметров с аргументом по умолчанию из конца списка параметров-типа
Начиная с Python 2.6 вы можете использовать встроенный ast.literal_eval
:
>>> import ast
>>> ast.literal_eval("{'muffin' : 'lolz', 'foo' : 'kitty'}")
{'muffin': 'lolz', 'foo': 'kitty'}
Это безопаснее, чем при использовании eval
. Как говорят его собственные документы:
>>> 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.
Например:
>>> 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
Подводя итог:
import ast, yaml, json, timeit
descs=['short string','long string']
strings=['{"809001":2,"848545":2,"565828":1}','{"2979":1,"30581":1,"7296":1,"127256":1,"18803":2,"41619":1,"41312":1,"16837":1,"7253":1,"70075":1,"3453":1,"4126":1,"23599":1,"11465":3,"19172":1,"4019":1,"4775":1,"64225":1,"3235":2,"15593":1,"7528":1,"176840":1,"40022":1,"152854":1,"9878":1,"16156":1,"6512":1,"4138":1,"11090":1,"12259":1,"4934":1,"65581":1,"9747":2,"18290":1,"107981":1,"459762":1,"23177":1,"23246":1,"3591":1,"3671":1,"5767":1,"3930":1,"89507":2,"19293":1,"92797":1,"32444":2,"70089":1,"46549":1,"30988":1,"4613":1,"14042":1,"26298":1,"222972":1,"2982":1,"3932":1,"11134":1,"3084":1,"6516":1,"486617":1,"14475":2,"2127":1,"51359":1,"2662":1,"4121":1,"53848":2,"552967":1,"204081":1,"5675":2,"32433":1,"92448":1}']
funcs=[json.loads,eval,ast.literal_eval,yaml.load]
for desc,string in zip(descs,strings):
print('***',desc,'***')
print('')
for func in funcs:
print(func.__module__+' '+func.__name__+':')
%timeit func(string)
print('')
Результаты:
*** short string ***
json loads:
4.47 µs ± 33.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
builtins eval:
24.1 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
ast literal_eval:
30.4 µs ± 299 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
yaml load:
504 µs ± 1.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
*** long string ***
json loads:
29.6 µs ± 230 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
builtins eval:
219 µs ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
ast literal_eval:
331 µs ± 1.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
yaml load:
9.02 ms ± 92.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Вывод: предпочитают json.loads
Если для строки может быть всегда доверено, вы можете использовать eval
(или использовать literal_eval
, как было предложено, это безопасно, независимо от того, какая строка.) В противном случае вам нужен синтаксический анализатор. Парсер JSON (например, simplejson) будет работать, если он только когда-либо хранит контент, соответствующий схеме JSON.
http://docs.python.org/2/library/json.html
JSON может решить эту проблему, хотя его декодер хочет получить двойные кавычки вокруг ключей и значений. Если вы не против замены hack ...
import json
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
json_acceptable_string = s.replace("'", "\"")
d = json.loads(json_acceptable_string)
# d = {u'muffin': u'lolz', u'foo': u'kitty'}
Учтите, что если у вас есть одинарные кавычки в качестве части ваших ключей или значений, это не будет выполнено из-за неправильной замены символа. Это решение рекомендуется только в том случае, если у вас есть сильное отвращение к eval-решению.
Подробнее о json single quote: jQuery одинарная кавычка в ответе JSON
+1
для информирования, что декодер хочет двойные кавычки вокруг клавиш и значений.
– h8pathak
1 February 2017 в 06:13
Пример OP:
s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
Мы можем использовать Yaml для работы с этим нестандартным json в строке:
>>> import yaml
>>> s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> s
"{'muffin' : 'lolz', 'foo' : 'kitty'}"
>>> yaml.load(s)
{'muffin': 'lolz', 'foo': 'kitty'}
Если вы не можете использовать Python 2.6, вы можете использовать простое safeeval immenentation, например http://code.activestate.com/recipes/364469/
. Это контрейлеры на компиляторе Python, поэтому вам не нужно делать всю грубую работу самостоятельно.
никакие libs не используются:
dict_format_string = "{'1':'one', '2' : 'two'}"
d = {}
elems = filter(str.isalnum,dict_format_string.split("'"))
values = elems[1::2]
keys = elems[0::2]
d.update(zip(keys,values))
ПРИМЕЧАНИЕ. Поскольку он имеет hardcoded split("'")
, он будет работать только для строк, где данные «одинарные».
string = "{'server1':'value','server2':'value'}"
#Now removing { and }
s = string.replace("{" ,"");
finalstring = s.replace("}" , "");
#Splitting the string based on , we get key value pairs
list = finalstring.split(",")
dict ={}
for i in list:
#Get Key Value pairs separately to store in dictionary
keyvalue = i.split(":")
#Replacing the single quotes in the leading.
m= keyvalue[0].strip('\'')
m = m.replace("\"", "")
dict[m] = keyvalue[1].strip('"\'')
print dict
Вы можете попробовать это.
>>> import ast
>>> data = "{'user': 'bob', 'age': 10, 'grades': ['A', 'F', 'C']}"
>>> ast.literal_eval(data)
O/P: {'age': 10, 'grades': ['A', 'F', 'C'], 'user': 'bob'}
>>> user = ast.literal_eval(data)
>>> user['age']
O/P: 10
>>> user['grades']
O/P: ['A', 'F', 'C']
>>> user['user']
O/P: 'bob'