在尝试编写单元测试时,检查抽象基类的具体子类是否确实在实例化时引发了TypeError,如果没有实现其中一个必需的方法,我偶然发现了一些让我想知道何时检查是否定义了所需方法的东西通过具体的子类实际执行.
到目前为止,我会说:在实例化对象时,因为这是在运行程序时实际引发Exception的时间.
但请看这个片段:
import abc
class MyABC(abc.ABC):
@abstractmethod
def foo(self): pass
MyConcreteSubclass(MyABC):
pass
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,尝试实例化MyConcreteSubclass会引发TypeError:
>>> MyConcreteSubclass()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-39-fbfc0708afa6> in <module>()
----> 1 t = MySubclass()
TypeError: Can't instantiate abstract class MySubclass with abstract methods foo
Run Code Online (Sandbox Code Playgroud)
但是如果我首先声明一个有效的子类然后删除此方法会让我感到惊讶,会发生什么:
class MyConcreteSubclass(MyABC):
def foo(self):
print("bar")
MyConcreteSubclass.foo
--> <function __main__.MyConcreteSubclass.foo(self)>
>>> t = MyConcreteSubclass()
>>> t.foo()
bar
>>> del MyConcreteSubclass.foo
>>> MyConcreteSubclass.foo
<function __main__.MyABC.foo(self)>
>>> t = MyConcreteSubclass()
>>> print(t.foo())
None
Run Code Online (Sandbox Code Playgroud)
这肯定不是我的预期.在删除后检查MyConcreteSubclass.foo时,我们看到通过方法解析顺序检索基类的Abstract方法,这与我们首先在具体子类中没有实现foo的行为相同.
但是在实例化之后,不会引发TypeError.所以我想知道,当解释器评估具体子类的主体时,检查是否已经执行了所需的方法吗?如果是这样,为什么只有当有人试图实例化子类时才会引发TypeErrors?
上面显示的测试是使用Python 3.6.5执行的.
是否可以在Jenkins中过滤构建历史记录,以便只显示具有特定标签或参数的构建?
假设我有一些参数化的工作.其中一个参数是一个简单的字符串,可以是"实验性"或"官方".是否有任何插件可以让我过滤构建历史记录只显示"官方"版本?
我在Python中使用try ... except块捕获异常。该程序尝试使用os.makedirs创建目录树。如果引发WindowsError:目录已存在,我想捕获异常,什么也不做。如果引发任何其他异常,我将捕获该异常并设置一个自定义错误变量,然后继续执行脚本。理论上的工作如下:
try:
os.makedirs(path)
except WindowsError: print "Folder already exists, moving on."
except Exception as e:
print e
error = 1
Run Code Online (Sandbox Code Playgroud)
现在,我想对此加以增强,并确保WindowsError的except块仅处理那些错误消息包含“目录已存在”且没有其他内容的异常。如果还有其他WindowsError,我想在下一个except语句中处理它。但不幸的是,以下代码不起作用,并且没有捕获到异常:
try:
os.makedirs(path)
except WindowsError as e:
if "directory already exists" in e:
print "Folder already exists, moving on."
else: raise
except Exception as e:
print e
error = 1
Run Code Online (Sandbox Code Playgroud)
如何实现我的第一个except语句专门捕获“目录已存在”异常,而所有其他语句在第二个except语句中得到处理?