2017-02-11 41 views
0

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

所以预期的效果运行像changeLayers( '富', '酒吧',someLayers, '可见的',真正的),并最终对changeLayerState(layer,visible = True)进行评估。

如果我运行这样的东西,我得到一个语法错误,我假设因为我通过它作为一个标志字符串'可见'。

这简化了一点,但是我想要做的事情的本质。有没有办法做到这一点?

希望是有道理的..

编辑:所以我是用伪代码广泛撒网,而不是吓唬人关谁是不熟悉玛雅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) 

而且工作正常。但是,如果我尝试functionize那些改变图层状态这样的台词:

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' // 

是否让更多的什么,我试图做有意义吗?我试图通过一个标志来使用另一个函数的函数。

+0

标志和值,只要你想你可以传递尽可能多的值(标志),没有理由为什么它不可能,但是如果没有你所得到的错误的知识,没有人能够帮助你。 'SyntaxError'意味着你的代码中有语法错误,所以发布整个错误回溯和相关的代码。 – yedpodtrzitko

回答

0

如果youre试图调用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) 
+0

是或直接作为输入 – DrWeeny

+0

中的关键字传递,看起来他直到运行时才会知道标记 - 他必须将所有标记都传递给默认值,并将其外部函数解析为id,标记为'flag'和'价值',否则' – theodox

+0

谢谢!我尝试过使用kwargs,但没有点击。现在它确实有效。 –

相关问题