0

我在python中有这段代码:

"{0}.currentTime += 1;".format(hairSyst)

wherehairSyst是前面定义的字符串。我不明白为什么会出现语法错误。我的目的是在maya中设置一个表达式,表达式有点长,我把整个东西贴在下面,也许你可以提出一个更好的方法。

expr = ("if ({0}.autoOverlap == 1){".format(firstControl.getName())
        "{0}.currentTime += 1;".format(hairSyst)
        "{0}.currentTime += 1;".format(nucleus)
        "float $refresh_tx = {0}.translateX;".format(cube)
        "float $refresh_ty = {0}.translateY;".format(cube)
        "float $refresh_tz = {0}.translateZ;".format(cube)
        "float $refresh_rx = {0}.rotateX;".format(cube)
        "float $refresh_ry = {0}.rotateY;".format(cube)
        "float $refresh_rz = {0}.rotateZ;".format(cube)
        "}else if({0}.autoOverlap == 0){".format(firstControl.getName())
        "{0}.currentTime = 1;".format(hairSyst)
        "{0}.currentTime = 1;".format(nucleus)
        "}"
)
4

2 回答 2

1

最好让它成为一个formating 字符串:

expr = """if ({0}.autoOverlap == 1){{
          {1}.currentTime += 1;
          {2}.currentTime += 1;
          float $refresh_tx = {3}.translateX;
          float $refresh_ty = {3}.translateY;
          float $refresh_tz = {3}.translateZ;
          float $refresh_rx = {3}.rotateX;
          float $refresh_ry = {3}.rotateY;
          float $refresh_rz = {3}.rotateZ;
          }}else if({0}.autoOverlap == 0){{"
          {1}.currentTime = 1;
          {2}.currentTime = 1;
          }}""".format(firstControl.getName(), hairSyst, nucleus, cube)

注意使用"""三引号而不是"单引号来格式化多行字符串。

编辑:

如果原始字符串包含{ },我们必须{{ }}按照文档将它们转义:

6.1.3. 格式化字符串语法

str.format() 方法和 Formatter 类共享相同的格式字符串语法(尽管在 Formatter 的情况下,子类可以定义自己的格式字符串语法)。

格式字符串包含用大括号 {} 包围的“替换字段”。大括号中未包含的任何内容都被视为文字文本,它会原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过加倍来转义:{{ 和 }}。

于 2017-03-23T19:44:11.023 回答
0

您必须连接这些字符串。现在,eval()看到您传入了 13 个字符串,但eval()只接受了一个字符串。所以做这样的事情:

expr = ("if ({0}.autoOverlap == 1){ ".format(firstControl.getName()) + 
     "{0}.currentTime += 1; ".format(hairSyst) + 
     "{0}.currentTime += 1; ".format(nucleus) + 
     "float $refresh_tx = {0}.translateX; ".format(cube) + 
     "float $refresh_ty = {0}.translateY; ".format(cube) + 
     "float $refresh_tz = {0}.translateZ; ".format(cube) + 
     "float $refresh_rx = {0}.rotateX; ".format(cube) + 
     "float $refresh_ry = {0}.rotateY; ".format(cube) + 
     "float $refresh_rz = {0}.rotateZ; ".format(cube) + 
     "}else if({0}.autoOverlap == 0){ ".format(firstControl.getName()) + 
     "{0}.currentTime = 1; ".format(hairSyst) + 
     "{0}.currentTime = 1; ".format(nucleus) + 
     "}"
)

我还在每个字符串后添加了空格,以确保它们不会相互碰撞。

于 2017-03-23T19:38:52.477 回答