Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“尝试”(Maya Python除外)进行检查以确保选择中的项目是正确的节点类型_Python_Maya - Fatal编程技术网

使用“尝试”(Maya Python除外)进行检查以确保选择中的项目是正确的节点类型

使用“尝试”(Maya Python除外)进行检查以确保选择中的项目是正确的节点类型,python,maya,Python,Maya,**在检查所选节点的节点类型时,如何知道何时使用try/except和if/else,以及在下面这样的情况下如何使用try/except 我想做这样的事情:** selected_nodes = cmds.ls(sl = True) for selected_node in selected_nodes: #example one validate_node_type = validate_nodes(selected_node) if validate_n

**在检查所选节点的节点类型时,如何知道何时使用try/except和if/else,以及在下面这样的情况下如何使用try/except

我想做这样的事情:**

selected_nodes = cmds.ls(sl = True)

for selected_node in selected_nodes:

    #example one

    validate_node_type = validate_nodes(selected_node)
        if validate_node_type == True
            return True
        else:
            return False

    def validate_nods(selected_node):
        node_type = cmds.node_type(selected_node)
        if node_type == 'file':
            return True
        else:
            return False
    
    #example two, or is better to use try/except?

    try:
        validate_nodes(selected_node)
        return True
    except:
        return False
    
    def validate_nodes(selected_node):
        selected_node_type = nodeType(selected_node)
        try:
            selected_node_type == 'file'
            return True
        except:
            return False  

简而言之,您可以使用
if/else
执行逻辑检查,并使用
try/except
包装可能引发错误的代码,从而阻止其余代码执行

在您的特定示例中,
node\u type=cmds.nodeType(selected\u node)
可能会引发错误,因此如果您要使用try/except anywhere,可能就是这个地方

但有时,抛出错误是完全正确的做法——特别是在操作不是无人参与的情况下

就我个人而言,我会重构您的代码,使其如下所示:

def validate_文件节点(节点):
''检查一个或多个对象是否为'file'类型`
Args:
节点(str | list[str]):要检查的节点
返回:
布尔:如果所有匹配,则为True,否则为False
'''
如果不是isinstance(节点,(列表,元组)):
节点=[节点]
对于节点中的节点:
如果cmds.nodeType(节点)!='文件“:
返回错误
返回真值
所选_节点=cmds.ls(sl=True)
有效的\u文件=验证\u文件节点(选定的\u节点)
打印('所选节点是有效文件?{}'。格式(有效文件))
请记住,如果您向其提供错误信息,这可能会引发错误,但您如何处理这些信息可能应该在验证函数之外处理

编辑:在回答评论时,为了捕捉错误,我会在这里进行编辑:

selected_nodes=cmds.ls(sl=True)
有效的\u文件=无
尝试:
#此方法可能会引发错误,但我们在此处捕获它,而不是在方法本身中捕获它
有效的\u文件=验证\u文件节点(选定的\u节点)
例外情况除外,如e:
print('validate_fileNodes方法引发异常:{}'。格式(e))
如果有效的_文件==True:
打印('所选节点有效!')
elif valid_files==False:
打印('所选节点无效,但检查正常')
其他:
打印('检查失败。我们不知道这里发生了什么')

您可能把这件事复杂化了。如果您只想检查节点列表是否为文件类型,那么几乎可以用一行代码完成:

import maya.cmds as cmds

def is_node_type(objs, node_type="file"):
    return len(cmds.ls(objs, type=node_type)) > 0

is_node_type(cmds.ls(sl=True))  # Check with current selection.
您可以将对象列表传递给
cmds.ls
,并将参数
type
指定给要检查的任何对象。如果对象集合中存在该类型,则直接返回该类型的长度将返回
True
,否则返回
False
。由于该函数还有
node\u type
参数,您可以轻松地将其更改为其他参数,而无需对其进行硬编码


在这一点上,你可以用它做任何你想做的事情。通常情况下,您可以使用
if
else
条件。虽然在嵌套许多
if
语句时,有些情况可能会很冗长,因此在这种情况下,您可以预测可能出现的错误,并使用
try
捕获它,但
除外。我相信这就像。在某些情况下,您别无选择,只能使用
try
,这通常是在涉及外部因素时发生的,例如依赖internet连接或连接到某个可能已关闭的服务器。

谢谢,我是否会使用try,除了nodeType命令?我的脑子一直在想如果,否则。。。因为try在其行中没有条件检查。此外,如果它不是文件节点,它将抛出什么异常错误?如果向其提供不正确或无法解决的节点名称,nodeType命令仅会抛出错误(与大多数Maya函数一样)。我还没有实际测试过这一点,但这就是大多数
cmds
命令的工作方式。但实际上,如果您正在获取用户的选择,那么使用这种类型的命令是非常安全的。我更新了我的答案,以便更彻底地回答您的问题。不确定,但我对这个问题的看法是,OP显然是编程的新手,或者至少是Python。因此,强调可读性似乎比一行代码更有价值,或者说是经过优化但难以阅读的代码。