2017-02-11 22 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,但沒有點擊。現在它確實有效。 –

相關問題