2017-02-11 12 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 ('Foo', 'бар', someLayers, 'видимый', True) и в конечном итоге имеющих changeLayerState (layer, visible = True).

Если я запускаю что-то вроде этого, то получаю синтаксическую ошибку, я предполагаю, что передаю ей строку «visible» как флаг.

Это немного упрощает его, но является сущностью того, что я пытаюсь сделать. Есть ли способ сделать это?

Надежда, что имеет смысл ..

EDIT: Я использовал псевдокод, чтобы бросить широкую сеть и не испугать никого от, кто не знаком с Maya Python, но я думаю, что было более запутанным. Итак, вот фрагмент, который просматривает все уровни отображения в сцене, превращает все те, которые заканчиваются в «Control», невидимым и устанавливает все те, которые заканчиваются в «Геометрии», на обычный слойState (то есть не на которые они могут быть легко выбраны в окне просмотра):

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

похоже, что он не будет знать флаги до времени исполнения - ему придется передать их всем по умолчанию и проанализировать его внешнюю функцию с идентификатором, какие из них были указаны «флагом», и 'значение' в противном случае ' – theodox

+0

Спасибо! Я попытался использовать kwargs, но не нажал. Теперь это происходит, и это работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^