Функция def: если ничего не выбрано, вернуть список всех объектов

Я пытаюсь определить функцию, которая возвращает список, когда я указываю объект, и он возвращает список всех объектов в сцене с помощью *_control, когда я ничего не указываю.. это моя функция, но она не работает.... я работаю с майей тогда..

from maya import cmds

def correct_value(selection):

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

       if not selection : 
            objs = cmds.ls ('*_control')    
            return objs

когда я ничего не указываю, он возвращает ошибку:

Ошибка: строка 1: ошибка типа: строка файла 1: correct_value() принимает ровно 1 аргумент (задано 0)

в чем дело??

5 ответов

Решение
def correct_value(selection=None):
     if selection is None:  # note that You should check this before  
                            # You wil check whether it is list or not
        objs = cmds.ls ('*_control')    
        return objs

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

Для обработки параметра по умолчанию, даже если он может быть None

def correct_value(*args):
    if not args:
        objs = cmds.ls ('*_control')    
        return objs
    elif len(args) == 1:
        selection = args
        objs = selection
        return objs
    else:
       raise TypeError # ...

Ну, вы написали свою функцию с обязательным аргументом. Следовательно, вы должны передать аргумент. Вы можете написать его так, чтобы аргумент был необязательным, указав значение, которое будет использоваться, когда ничего не передается:

def correct_value(selection=None):

и т.п.

Если вы хотите, чтобы параметр был необязательным, вам нужно указать значение по умолчанию:

def correct_value(selection=None):
    # do something

    if selection is None: 
        #do something else

Вот действительно полезная пара шаблонов для такого рода вещей:

# always return a list from scene queries (maya will often return 'none' 
def get_items_named_foo():
     return cmds.ls("foo") or []  # this makes sure that you've always got a list, even if it's empty


# always use the variable *args method to pass in lists
def do_something(*args):
    for item in args:
        do_something(item)  # args will always be a tuple, so you can iterate over it

# this lets you do stuff like this without lots of boring argument checks:
do_something (*get_items_named_foo())

Если вы используете оба эти трюка последовательно, вы можете прозрачно обрабатывать случаи, когда ваши запросы Maya вернули None вместо списка

Кроме того, вы можете имитировать поведение Maya по умолчанию (где передача без аргументов использует текущий выбор) следующим образом:

def work_on_list_or_selected(*args):
   args = args or cmds.ls(sl=True) or []
   for item in args:
       do_something (item)
Другие вопросы по тегам