将标志传递给另一个函数?

Passing a flag to another function?

Python 新手,如果我的术语有点不对请原谅(请纠正我:)但是是否可以将标志和值传递给第二个函数并为该函数传递标志和值反过来将它们传递给第三个函数?

所以像这样:

def changeLayers(var1, var2, layers, flag, value):
  # do lots of stuff with var1 and var2...
  # finally: 
  for layer in layers:
    changeLayerState(layer, flag = value)


changeLayers('foo', 'bar', someLayers, 'visible', True)
changeLayers('foo', 'bar', otherLayers, 'layerState', 'normal')

所以期望的效果是 运行ning 类似 changeLayers('foo', 'bar', someLayers, 'visible', True) 并且最终有 changeLayerState(layer, visible = True) 进行评估。

如果我 运行 出现类似的语法错误,我假设是因为我将字符串 'visible' 作为标志传递给它。

这稍微简化了它,但这是我正在尝试做的事情的本质。有办法吗?

希望这是有道理的..

编辑:所以我使用伪代码广撒网,而不是吓跑任何不熟悉 Maya 的人 Python,但我想这更令人困惑。所以这里有一个片段,它查看场景中的所有显示层,将所有以 "Control" 结尾的图层变为不可见,并将所有以 "Geometry" 结尾的图层设置为正常的 layerState(即也就是说,没有引用或模板化,以便可以在视口中轻松选择它们):

import maya.cmds as cmds
layers = cmds.ls(type='displayLayer')
controlLayers = []
geomLayers = []

for layer in layers:
    if layer.endswith('Control'):
        conLayers.append(layer)
    elif layer.endswith('Geometry'):
        geomLayers.append(layer)   

for layer in controlLayers:
    cmds.layerButton(layer, edit = True, layerVisible = False)
    cmds.setAttr(layer + '.visiblity' , False)

for layer in geomLayers:
    cmds.layerButton(layer, edit = True, layerState = 'normal')            
    cmds.setAttr(layer + '.displayType', 0)

这行得通。但是如果我尝试像这样改变图层状态的那些线:

import maya.cmds as cmds
layers = cmds.ls(type='displayLayer')
controlLayers = []
geomLayers = []

def changeLayerState(layers, flag, value, attr, attrValue):
    for layer in layers:
        cmds.layerButton(layer, edit = True, flag = value)            
        cmds.setAttr(layer + '.' + attr, attrValue)

for layer in layers:
    if layer.endswith('Controls'):
        controlLayers.append(layer)
    elif layer.endswith('Geometry'):
        geomLayers.append(layer)   

changeLayerState(geomLayers, 'layerState', 'normal', 'displayType', 0)
changeLayerState(controlLayers, 'layerVisible', False, 'visibility', False)

我出错了:

// Error: Invalid flag 'flag'
# Traceback (most recent call last):
#   File "<maya console>", line 17, in <module>
#   File "<maya console>", line 8, in changeLayerState
# TypeError: Invalid flag 'flag' //

这是否让我想做的事情更有意义?我正在尝试传递一个标志以用于另一个函数的函数。

如果您尝试调用 changeLayerState 并且它需要像 changeLayerState(something, someflag=somevalue) 这样的标志,您可以使用 ** keyword argument syntax

传递带有标志和值的字典
def changeLayers(var1, var2, layers, flag, value):
    # etc
    keyword_args = {flag: value}
    for layer in layers:
       changeLayerState(layer, **keyword_args)