Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
是否有任何Python关于“有条件”的建议;除「;阻碍?_Python_Exception_Python 3.x_Exception Handling_Pep - Fatal编程技术网

是否有任何Python关于“有条件”的建议;除「;阻碍?

是否有任何Python关于“有条件”的建议;除「;阻碍?,python,exception,python-3.x,exception-handling,pep,Python,Exception,Python 3.x,Exception Handling,Pep,在系统编程中,通常会调用一些可能失败的库函数,如果失败,则检查errno以了解确切原因。即使在Python中也是如此,我认为它比需要的更麻烦。让我们以一些试图删除文件的代码为例,如果该文件不存在,则会以静默方式继续: try: sftp.unlink(path) except IOError as ex: if ex.errno != errno.ENOENT: raise 我想知道Python中是否允许或提议做类似的事情: try: sftp.unli

在系统编程中,通常会调用一些可能失败的库函数,如果失败,则检查
errno
以了解确切原因。即使在Python中也是如此,我认为它比需要的更麻烦。让我们以一些试图删除文件的代码为例,如果该文件不存在,则会以静默方式继续:

try:
    sftp.unlink(path)
except IOError as ex:
    if ex.errno != errno.ENOENT:
        raise
我想知道Python中是否允许或提议做类似的事情:

try:
    sftp.unlink(path)
except IOError as ex if ex.errno == errno.ENOENT:
    pass
我认为这有几点值得推荐:

  • 更简洁
  • 熟悉:因为我们已经可以捕获某些类型的异常,所以我们只捕获某些实际实例。未捕获的异常以通常的方式传播
  • 不需要新的关键字,也不需要任何主要的新语法结构

  • 如果这之前没有被考虑过,我会感到惊讶,所以我会接受任何与过去或未决提案的链接作为答案。我也愿意接受一个答案,解释为什么上述内容会给现有的语言带来任何问题(Python 3.x,因为我认为2.x基本上是冻结的)。

    我怀疑你会在这个建议上走得更远,但你可以通过上下文管理器得到你想要的东西。试试这个:

    import os
    
    class SuppressOSError(object):
        def __init__(self, *valid_errno):
            self.valid_errno = valid_errno
    
        def __enter__(self):
            return self
    
        def __exit__(self, ex_type, ex_value, traceback):
            if issubclass(ex_type, OSError) and ex_value.errno in self.valid_errno:
                return True # suppress exception
    
    with SuppressOSError(os.errno.ENOENT):
        os.remove('/tmp/no_such_file')
        print("This line will not be reached.")
    print("An exception was not raised.")
    
    上面打印了“未引发异常”


    您可以传入任意数量的
    errno
    值;在我的例子中,我刚刚通过了一个。在Python2.7.4中测试过,应该可以在任何Python2.5或更新版本中使用。

    我认为这是一个好主意,但它根本不适合本网站的格式,它也引起了讨论,因为这无法回答,而且是自以为是的。检查是否还没有被提出的最好地方是检查(如果它被正式提出/拒绝)以及用于任何讨论的…它也值得参考:自Python3.4+以来,有一个正式的解决方法:
    contextlib.suppress(*例外)
    我认为这比将if语句与except@InbarRose:我在问题中明确说明了如何回答:带有政治公众人物链接(我找不到)或其他提案文件,或对其可能破坏语言的方式进行一些技术解释。除非两者都有,否则最好的答案是最终以一个新的政治公众人物结束,或者一些代码显示更好的方法。如果您有另一个StackExchange站点,我应该将此发布在上面,请务必让我知道。通过引入,请参阅,感谢您向我们展示这个技巧,但我必须说,我可能永远不会使用它,因为它要复杂得多(新的维护人员更难遵循,代码更多)比简单的解决方案更难实现,但易于使用。你不必实现它,因为我刚刚给了你。这是解决你问题的最好方法,IMHO,它使用该语言现在支持的功能(从2.5开始).Python通常是朝这个方向发展的;请查看
    contextlib
    的文档并查找
    contextlib.suppress()
    此处:您将无法成功获得对该语言的拟议更改。类似的更改已经讨论过,但并不流行。Python开发社区非常小心地向该语言添加新内容,如果没有充分的理由,他们不会这样做。新重构的异常解决了大部分问题不管怎样,我在3.3及更新版本中,而我的解决方案在2.5及更新版本中有效,因此我认为没有足够的问题来支持对语言的更改。