2013-06-08 1 views
0

У меня есть проблема с определением keywords_aguments. Я пытаюсь определить функцию, которая возвращает все объекты с помощью _ _control в сцене, когда ничего не указано, но я бы хотел выбрать, какие из них «left» или «right» должны возвращаться. Ниже вы можете найти мою функцию. Я не понимаю, где ошибка.некоторая проблема с ** keywords_arguments в python

from maya import cmds 

def correct_value(selection=None, **keywords_arguments): 
    if selection is None: 
     selection = cmds.ls ('*_control')  

    if not isinstance(selection, list): 
     selection = [selection] 

    for each in keywords_arguments: 
     keywords_list = [] 
     if each.startswith('right','left'): 
      selection.append(each) 



    return selection 

correct_value() 
+0

В чем заключается цель 'keywords_list = [ ] '? – chepner

ответ

3

Ключевыми словами являются словари. Вы можете распечатать их или проверить тип с помощью функции type(). Это позволяет вам самостоятельно использовать словарь в изолированном контексте и выяснить, как решить вашу проблему самостоятельно.

Теперь, когда у вас есть словарь x = {1:2}, итерация по нему с помощью for даст вам только один, то есть он будет перебирать только ключи (!), А не соответствующие значения. Для этого используйте for key, value in dictionary.items(), а затем используйте значение if key in ('right', 'left').

0

Код, который у вас есть, добавит «правый» или «левый» в конец списка.

Я думаю, что вы хотите что-то вроде этого:

def find_controls(*selection, **kwargs): # with *args you can pass one item, several items, or a list 
    selection = selection or cmds.ls("*_control") or [] # supplied objects, or the ls command, or an empty list 

    if not kwargs: 
     return list(selection) # no flags? reutrn the whole list 

    lefty = lambda ctrl: ctrl.lower().startswith("left") # this will filter for items with left 
    righty = lambda ctrl: ctrl.lower().startswith("right") # this will filter for items with left 

    filters = [] 
    if kwargs.get('left'): # safe way to ask 'is this key here and does it have a true value?' 
     filters.append(lefty) 

    if kwargs.get('right'): 
     filters.append(righty) 

    result = [] 
    for each_filter in filters: 
     result += filter (each_filter, selection) 

    return result 


find_controls (left=True, right=True) 
# Result: [u'left_control', u'right_control'] # 

find_controls (left=True, right =False) # or just left=True 
# Result: [u'left_control'] # 

find_controls() 
# Result: [u'left_control', u'middle_control', u'right_control'] # 

Хитрость здесь заключается в использовании lambdas (которые в основном только функции в более коротком формате) и встроенную функцию фильтра (который применяет функцию к все в списке и возвращает вещи, где функция true - ненулевой, неверный ответ. Легко видеть, как можно расширить его, просто добавив больше ключевых слов и соответствующих lambdas.