2014-11-06 2 views
2

Просто любопытно, сделал интересное наблюдение, что мне не удалось определить ключи словаря, не процитировав их. Я предполагаю, что это уязвимость в Python?Действительно ли цитируемые словарные ключи должны быть обязательными?

В образце, а не в РЕПЛ, следующий не вызывает исключение:

>>> {foo:'foo', bar:'bar'} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 

Как питонисты обрабатывать свои ключи? Вы защищаете секретные или цитируемые ключи и почему?

+0

Не могли бы вы привести пример того, что вы имеете в виду? –

+2

Вы имеете в виду 'dict (key = 1)' и '{'key': 1}'? – ryanpattison

+0

да, как и выше, кроме '{key: 1}' где 'key' не является уже существующей переменной. «Ушел», потому что в REPL это исключает исключение. – aug2uag

ответ

2

ключи словаря может быть любой hashable объект (строка, целое число, кортеж и т.д.):

>>> dct = {'a': 1, 1: 'a'} 
>>> dct['a'] 
1 
>>> dct[1] 
'a' 
>>> 

Цитирование ключ просто означает, что ключ является строкой, как и с 'a' выше.


Насколько ваше заявление, что:

Я сходил с определением ключей без процитировать их

Я предполагаю, что вы имеете в виду вы сделали что-то вроде этого:

dct = {key1: 1, key2: 'a'} 

Настоящий код не имеет особого значения. Это просто означает, что имена key1 и key2 относятся к объектам хеширования, которые теперь становятся ключами словаря. Пример приведен ниже:

>>> key1 = 'a' 
>>> key2 = 1 
>>> dct = {key1: 1, key2: 'a'} 
>>> dct[key1] 
1 
>>> dct[key2] 
'a' 
>>> dct['a'] 
1 
>>> dct[1] 
'a' 
>>> 

С другой стороны, если вы имеете в виду, что вы использовали dict встроенный сделать словарь:

dct = dict(key1='a', key2=1) 

Тогда вы должны знать, что ключи являются еще нормальные строки:

>>> dct = dict(key1='a', key2=1) 
>>> dct 
{'key2': 1, 'key1': 'a'} 
>>> dct[key1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'key1' is not defined 
>>> dct['key1'] 
'a' 
>>> 

Наконец, в отношении вашего вопроса о том, следует ли вам всегда использовать строковые ключи, ответ зависит от. Если вам нужны ваши ключи для хранения данных, которые могут быть представлены только в виде строки (например, имя человека), используйте строки. Если вам нужны ключи для хранения числовых данных (например, номера идентификаторов), используйте целые числа или поплавки или что угодно.

Проще говоря, сделайте все, что имеет смысл для вашей программы.

+0

Я думаю, что rpattiso может быть прав, и он может думать о синтаксисе конструктора: 'dict (key1 = 1, key2 = 'a')', что означает то же самое, что '{'key1' : 1, 'key2': 'a'} '. Опять же, может быть, нет; это непросто сказать из вопроса ... – abarnert

+0

да, извините за двусмысленность.в основном что-то вроде '{foo: 'foo', bar: 'bar'}' – aug2uag

+0

@iCodez мне пришлось читать его дважды, но да, это ответ на мой вопрос! – aug2uag

Смежные вопросы