Так что это мой первый вопрос на форуме, и я надеюсь, что я делаю это правильно. Общий вопрос: Как я могу гарантировать, что python не возвращает никаких ошибок при написании скрипта, который позволяет пользователю вводить значения разных типов данных в зависимости от контекста или параметра, который они хотят изменить? Конкретно: Я новичок в python и хочу написать скрипт, который позволяет пользователям The Foundry's Nuke изменять значения на нескольких узлах одного и того же класса одновременно. В зависимости от того, нужно ли изменить желаемый параметр, есть флажок ('bool') и вход RGBA ('4 floats') ... вход должен быть другого типа. Поиск в форуме Я обнаружил, что тип может быть проверен type() функцией и сравнивается в операторе if с помощью функции isinstance(). Думаю, я мог бы с этим справиться, но тип, например. Многократная кнопка Gradenode возвращает тип «AColor_Knob». Я ожидал чего-то вроде поплавка. И сравнение его в isinstance() не дает мне соответствия независимо от типа данных, с которым я сравниваю.Как обеспечить, чтобы пользователь мог вводить любой тип данных (str, float, int, boolean ...)?
скрипт до сих пор:
nukescripts.clear_selection_recursive()
userInput = nuke.getInput('Which type of nodes would you like to select? (!!!first char has to be capitalized!!!)',
'Shuffle')
matchingNodes = []
for each in nuke.allNodes():
if each.Class() == userInput:
matchingNodes.append(each)
else:
pass
for i in matchingNodes:
i.setSelected(True)
nuke.message(str(len(
matchingNodes)) + ' matching Nodes have been found and are now selected! (if 0 there either is no node of this type or misspelling caused an error!)')
userInput_2 = nuke.getInput('Which parameter of these nodes would you like to change? \n' +
'(!!!correct spelling can be found out by hovering over parameter in Properties Pane!!!)',
'postage_stamp')
userInput_3 = nuke.getInput('To what do you want to change the specified parameter? \n' +
'(allowed input depends on parameter type (e.g. string, int, boolean(True/False)))', 'True')
for item in matchingNodes:
item.knob(userInput_2).setValue(userInput_3)
Как я проверил типы данных до сих пор:
selected = nuke.selectedNode()
knobsel = selected.knob('multiply')
print(type(knobsel))
#if type(knobsel) == bool:
if isinstance(knobsel, (str,bool,int,float,list)):
print('match')
else:
print('no match')
Большое спасибо за ваш ответ. Я, как новичок, многому научился. Но у меня все еще есть несколько вопросов, если вы разрешаете: я не знаком с tcl, так что: '' root. {0}. {1} "{2}" '. Format (node.fullName(), knob_name, knob_value) 'do? Кроме того, я никогда не видел этот формат: ''new = {} (example)'' Как python знает, что делать с '(example)'? – leabum
@leabum Вам нужно искать форматирование строк, вот несколько ссылок: formatstrings pep-3101 str.format Я отредактировал исходное сообщение выше, чтобы включить некоторую информацию о командах TCL в Nuke. Кстати, этот пост отмечен python-3.x, но Nuke по-прежнему работает на 2.7 (в настоящее время на версии 10.x). –