如何访问转换为变量的字符串的名称?

时间:2014-12-12 16:55:09

标签: python string variables freecad

我在FreeCAD中使用Python并向我们使用的对象添加属性(可调变量):

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.如何访问variable0的名称并将其放在 .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 个答案:

答案 0 :(得分:0)

我不是FreeCAD的专家所以这是一个猜测,但是......,看起来像addProperty获取变量的名称,类型和描述,并为您创建一个默认值。这些示例在一个步骤中显示创建/更新,就像您的示例中一样。问题是如果您事先不知道变量的名称该怎么办。在python中,您使用getattrsetattr处理“变量属性名称”。所以,如果你有一个名字和一个值,你可以:

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属性实现感到困惑。属性对象应该有一个众所周知的名称来访问它的值,而不是一些棘手的属性名称。

答案 1 :(得分:0)

在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)

答案 2 :(得分:0)

Thnx为你回答!但是,对于某些内容,您展示的第一个示例并未为生成的variable0variable1variable2分配值。使用字典工作!当我将例如对象列表插入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)配置文件组成的放样。