Как получить доступ к имени строки, преобразованной в переменную?

Я работаю с Python во FreeCAD и добавляю свойства (регулируемые переменные) к объекту, который мы используем:

obj.addProperty("App::PropertyFloat","variable","variable label","variable explanation").variable = 2

Используя цикл for, я хочу добавить несколько свойств с несколькими именами переменных. Я читал, как преобразовать строку в переменную, но я не нашел, как получить доступ к имени этой переменной. В моем случае: как использовать его в позиции.variable в моем коде выше.

Скажи, у меня есть код:

varName = []
for i in range(3):
    varName.append('variable%s' %i)
    exec("%s = %d" % (varName[i],2))

Например, я знаю, что могу использовать print variable0, чтобы получить значение 2. Как я могу получить доступ к имени переменной 0 и поместить его в положение .variable? Я читал о создании списка или словаря переменных, но вы можете получить доступ только к значению переменной, а не к ее имени, верно?

Список может быть входным для этого объекта, и его содержимое должно быть присвоено именам переменных. Вывод должен выглядеть следующим образом (но подходящим для любой длины списка ввода):

obj.addProperty("App::PropertyFloat","variable0,"variable label","variable explanation").variable0 = input[0]
obj.addProperty("App::PropertyFloat","variable1,"variable label","variable explanation").variable1 = input[1]
etc.

3 ответа

Я не эксперт по FreeCAD, так что это что-то вроде предположения, но..., похоже addProperty берет имя, тип и описание для переменной и создает ее со значением по умолчанию для вас. Примеры показывают создание / обновление за один шаг, как в вашем примере. Проблема в том, что делать, если вы заранее не знаете имя переменной. В python вы обрабатываете "имена атрибутов переменных" с помощью getattr а также setattr, Итак, если у вас есть имя и значение, вы можете:

name = 'some_name'
value = 1
setattr(obj.addProperty("App::PropertyFloat", name, "variable label",
    "variable explanation"), name, value)

Существуют различные способы генерирования имен переменных. В вашем примере

for i in range(3):
    setattr(obj.addProperty("App::PropertyFloat", "variable%d" % i, "variable label",
        "variable explanation"), name, i)

Или, может быть, вы уже где-то в диктанте

for name, value in mydict.items():
    setattr(obj.addProperty("App::PropertyFloat", name, "variable label",
        "variable explanation"), name, value)

Я действительно озадачен реализацией свойства FreeCAD. У объекта свойства должно быть одно общеизвестное имя для доступа к его значению, а не какая-то хитрая вещь с именем свойства.

В FreeCAD динамические свойства, добавленные из python, представляются как стандартные атрибуты экземпляра python. Поэтому вы можете использовать обычные hasattr, getattr, setattr и т. Д. Следовательно, ваш цикл может выглядеть так:

varName = []
for i in range(3):
    varName = 'variable' + str(i)
    obj.addProperty("App::PropertyFloat", varName, "awesome label","best property ever")
    setattr(obj, varName, 1.234) 
    value = getattr(obj, varname)

Спасибо за ваш ответ! Тем не менее, по некоторым причинам первый пример, который вы показали, не присваивает значение сгенерированному variable0, variable1 а также variable2, Использование словаря сработало! Когда я вставляю, например, список объектов в obj:

dict = {}
for i in range(len(objectList)):
    dict['object%d'%i] = objectList[i]
for name, value in dict.items():
    setattr(obj.addProperty("App::PropertyPythonObject", name, "object label", "object explanation"), name, value)

Я думаю, что это может быть полезно для сборки, например, чердака, который состоит из определенного пользователем количества (2D) профилей.

Другие вопросы по тегам