Как я могу использовать строку с тем же именем объекта в Python для доступа к самому объекту?

Например, в приведенном ниже коде я хотел бы получить список [1,2,3], используя x в качестве ссылки.

In[1]: pasta=[1,2,3] In:[2]: pasta Out[2]: [1, 2, 3] In [3]: x='pas'+'ta' In [4]: x Out[4]: 'pasta' 

  • Python: установка man-страниц в проекте на основе distutils
  • Python: функция диапазона для десятичных чисел
  • Создайте и установите элемент Pandas DataFrame в список
  • Содержимое кэша locmem в django?
  • Как разобрать html, который включает javascript-код
  • Python для Javascript
  • Python 3.1.3 Win 7: csv writow Ошибка "должно быть байтами или буфером, а не str"
  • Проверка строки имени хоста
  • 4 Solutions collect form web for “Как я могу использовать строку с тем же именем объекта в Python для доступа к самому объекту?”

    То, что вы пытаетесь сделать, – это плохая практика.

    То, что вам действительно нужно, это dict :

     >>> dct = {'pasta': [1,2,3]} >>> x = 'pas' + 'ta' >>> dct[x] [1, 2, 3] 

    Это правильная структура данных для конкретной задачи, которую вы пытаетесь достичь: используя строку для доступа к объекту.

    Другие ответы предложили (или просто показали с волнением) разные способы сделать это. Поскольку Python – очень гибкий язык, вы почти всегда можете найти такие разные способы для выполнения данной задачи, но «должен быть один – и желательно только один – простой способ сделать это» [1] .

    Все они будут выполнять работу, но не без недостатков:

    • locals() менее читабельны, излишне сложны и также открыты для рисков в некоторых случаях (см. ответ Марк Байерс ). Если вы используете locals() вы собираетесь смешивать реальные переменные с базами данных, это грязно.
    • eval() является довольно уродливым, является «быстрым и грязным способом получить исходный код динамически» [2] и плохой практикой .

    Когда вы сомневаетесь в правильном выборе, tring, чтобы следовать Zen Python, может быть началом.

    И эй, даже InteractiveInterpreter может использоваться для доступа к объекту с использованием строки, но это не значит, что я собираюсь.

    Как и другие, вы обычно должны избегать этого и просто использовать словарь (в примере, например, вы даете), или в некоторых случаях список (например, вместо использования my_var1, my_var2, my_var3 -> my_vars ).

    Однако, если вы все еще хотите сделать это, у вас есть пара вариантов.

    Вы можете:

     locals()[x] 

    или

     eval(x) #always make sure you do proper validation before using eval. A very powerfull feature of python imo but very risky if used without care. 

    Если паста является атрибутом объекта, вы можете получить ее безопасно:

     getattr(your_obj, x) 

    Ну, чтобы сделать то, что вы буквально попросили, вы можете использовать locals :

     >>> locals()[x] [1, 2, 3] 

    Однако почти всегда это плохая идея. Как заметил Свен Марнах в комментариях: Храните данные из ваших имен переменных . Использование переменных в качестве данных также может представлять угрозу безопасности. Например, если имя переменной исходит от пользователя, они могут читать или изменять переменные, к которым у вас никогда не было доступа. Им просто нужно угадать имя переменной.

    Вместо этого было бы гораздо лучше использовать словарь.

     >>> your_dict = {} >>> your_dict['pasta'] = [1, 2, 3] >>> x = 'pas' + 'ta' >>> your_dict[x] [1, 2, 3] 

    Использовать это

     hello = [1,2,3] print vars()['hello'] 

    Возвращает [1, 2, 3] .

    Interesting Posts

    python s3 boto connection.close вызывает ошибку

    ImportError при импорте из sklearn: невозможно импортировать имя check_build

    Пример аутентификации между сервером и сервером с использованием OAuth 2.0 с API Google API

    При использовании pandas.to_datetime сохранять только дату.

    virtualenv python сломался после обновления ubuntu с 15.10 по 16.04

    Python: в чем разница между модулями многопоточности и многопроцессорности?

    ValueError: недопустимое значение заполнения с помощью <class 'pandas.core.frame.DataFrame'>

    Как конвертировать DD в DMS в Python

    Программное обновление электронной таблицы, размещенной в документах google

    Линейное программирование (Simplex LP) PuLP?

    Cherrypy: какие решения для страниц с большим временем обработки

    Каков самый быстрый способ анализа больших XML-документов в Python?

    BeautifulSoup webscraping find_all (): поиск точного соответствия

    разница между numpy dot () и внутренним ()

    Является ли close () необходимым при использовании итератора на файловом объекте Python

    Python - лучший язык программирования в мире.