2017-02-11 8 views
0

ここではPythonの初心者です。私の用語について少し戸惑いましたが(と私を修正してください:)、フラグと値を2番目の関数に渡し、その関数のために渡すことは可能です3番目の関数?フラグを別の関数に渡しますか?

したがって、このような何か:

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のようなもの( 'FOO'、 'バー'、someLayers、 '目に見える'、true)を実行し、最終的にされますchangeLayerState(layer、visible = True)を持つことが評価されます。

私がSyntax Errorを取得したようなものを実行すると、文字列 'visible'がフラグとして渡されているためです。

これはこれを単純化しますが、私がやろうとしていることの本質です。これを行う方法はありますか?

理にかなっている希望。..

編集:だから私は広いネットをキャストする擬似コードを使用していないのMayaのPythonに精通していない誰オフを怖がらせるが、私はそれがさらに混乱だったと思いました。ここでは、シーン内のすべての表示レイヤーを見て、「コントロール」で終わるものをすべて非表示にし、「ジオメトリ」で終わるものをすべて通常のレイヤーステートに設定するスニペットを示します(つまり、ビューポートで簡単に選択できるように、参照またはテンプレート化されています)。

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しようとした場合:私は何をしようとしているのより多くの意味を作る

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

んが:

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) 

私はエラーが?私は別の関数から関数に使用するフラグを渡そうとしています。

+0

を使用して、あなたがフラグと値を持つ辞書を渡すchangeLayerState(something, someflag=somevalue)のようなフラグはあなたに多くの値(フラグ)を渡すことができ、何の理由はありません期待していた場合なぜそれが可能ではないだろうが、エラーの知識なしに誰もあなたを助けることができなくなってきている。 'SyntaxError'はあなたのコードに構文エラーがあることを意味します。そのため、エラートレースバック全体と関連するコードを投稿してください。 – yedpodtrzitko

答えて

0

youreのchangeLayerStateを呼び出そうとし、それはあなたが望むよう** 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

実行時までフラグを知らないように見えます - デフォルトですべてを渡し、外側の関数を 'flag'で指定されたidにパースする必要があります。それ以外の場合は 'value'となります。 – theodox

+0

ありがとうございました!私はkwargsを使ってみましたが、クリックしませんでした。さて、これはして、これは動作します。 –

関連する問題