0

我在尝试定义keywords_aguments 时遇到了一些问题。我正在尝试定义一个函数,当没有指定任何内容时,该函数返回场景中所有带有 *_control 的对象,但我想选择它必须返回哪些关于“左”或“右”的对象。您可以在下面找到我的功能。我不明白错误在哪里。

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()
4

2 回答 2

3

关键字参数是字典。您可以打印它们,或者可以使用该type()功能验证类型。这使您可以自己尝试在孤立的上下文中使用字典,并找出如何自己解决问题。

现在,当你有一个字典时x = {1:2},用 for 迭代它只会给你一个,即它只会迭代键(!),而不是相应的值。为此,使用for key, value in dictionary.items()然后使用 value if key in ('right', 'left')

于 2013-06-08T13:49:03.833 回答
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(基本上只是较短格式的函数)和内置过滤器函数(它将函数应用于列表中的所有内容并返回函数为非零、非假的东西答案。很容易看出如何通过添加更多关键字和相应的 lambda 来扩展它

于 2013-06-09T05:21:18.143 回答