Функция 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)