Как получить доступ к имени строки, преобразованной в переменную?
Я работаю с 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) профилей.