преобразование строки python в переменную - PullRequest
1 голос
/ 13 апреля 2020

Я прочитал почти все подобные вопросы, но ни один из них, похоже, не решил мою текущую проблему.

В моем коде python я импортирую строку из моего bashr c и в следующем, Я определяю то же имя, что и переменная для индексации моего словаря. Вот простой пример

obs = os.environ['obs']
>> obs = 'id_0123'

id_0123 = numpy.where(position1 == 456)
>> position1[id_0123] = 456
>> position2[id_0123] = 789

Но, конечно, когда я делаю positions[obs], он выдает ошибку, так как это строка, а не индекс (numpy.int64). Поэтому я пытался найти решение для преобразования моей строки в переменную, но все решения предлагали либо преобразовать в словарь, либо что-то еще и присвоить строку целому числу, но я не могу этого сделать, так как моя строка является динамической c и будет постоянно меняться. В итоге у меня будет около 50 переменных, и мне нужно проверить текущие объекты, соответствующие какой-либо переменной, чтобы я мог использовать их в качестве индексов для доступа к параметрам.

Редактировать:

Position1 и Position 2 - просто неровные массивы, поэтому в зависимости от вывода os.environ (в данном случае это id_0123) они будут печатать элемент массива. Поэтому я не могу присвоить 'id_0123' другую строку или число, так как я использую это точное имя в качестве переменной.

Лог c состоит в том, что существует много разных массивов, я хочу использовать вывод os .environ как вход для доступа к элементу этих массивов.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Если вы хотите использовать словарь, это сработает.

obs = 'id_0123'
my_dict = {obs: 'Tester'}
print (my_dict [obs])
print (my_dict ['id_0123'])
0 голосов
/ 13 апреля 2020

Вы можете использовать тот факт, что (почти) все является словарем в Python, чтобы создать контейнер хранения, который вы индексируете с помощью obs:

container = lambda:None

container.id_0123 = ...

...

print(positions[container.__dict__[obs]])

В качестве альтернативы, вы можете использовать globals() или locals() для достижения желаемого поведения:

import numpy
import os
def environment_to_variable(environment_key='obs', variable_values=globals()):
    # Get the name of the variable we want to reference from the bash environment
    variable_name = os.environ[environment_key]
    # Grab the variable value that matches the named variable from the environment. Variable you want to reference must be visible in the global namespace by default.
    variable_value = variable_values[variable_name]
    return variable_value

positions = [2, 3, 5, 7, 11, 13]
id_0123 = 2 # could use numpy.where here
id_0456 = 4

index = environment_to_variable(variable_values=locals())

print(positions[index])

Если вы поместите это в файл с именем a.py, вы можете наблюдать следующее:

$ obs="id_0123" python ./a.py
5
$ obs="id_0456" python ./a.py
11

Это позволяет индексировать массив по-другому во время выполнения, что, как кажется, ваше намерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...