我正在通过断言编写测试。有时我需要以某种方式否定断言。
例如:
def my_invalid_test(my_built_in_keyword_var): # Invalid syntax
assert my_built_in_keyword_var (1)
my_invalid_test(neg=(not not)) # Should pass a test
my_invalid_test(neg=not) # Should NOT pass a test
我可以通过三元运算符来实现(否定(,但它需要更多(几乎X2(行代码:
def already_valid_test(neg):
test_1 = some_looooooooooooooooong_statement()
assert test_1 if not neg else not test_1 #
already_valid_test(neg=False) # Should pass a test
already_valid_test(neg=True) # Should NOT pass a test
我尝试应用^
(XOR(,但为了使其成为正确的函数结果,函数应该始终是布尔,否则它只会减去(例如,从数字中(
那么,有没有一种方法可以将内置关键字分配给变量或通过类似的方法实现否定呢?
更简单的公式化方法:
def already_valid_test(neg: bool) -> None:
test_1 = some_looooooooooooooooong_statement()
assert test_1 if not neg else not test_1 #
是:
def already_valid_test(neg: bool) -> None:
assert neg == not some_looooooooooooooooong_statement()
如果你想通过传递一个函数来实现,你可以用lambda
表达式来构建一个函数,例如:
def my_invalid_test(my_built_in_keyword_var: Callable[[int], bool]) -> None:
assert my_built_in_keyword_var(1)
my_invalid_test(neg=lambda x: bool(x)) # Should pass a test
my_invalid_test(neg=lambda x: not x) # Should NOT pass a test
您可以使用运算符模块为变量分配关键字(但实际上不是(。operator.not_函数的作用与not
运算符相同,但由于它是一个函数,您将把函数分配给变量,而不是关键字。(请注意,这里的not_
有一个尾随下划线,因为纯not
将是一个语法错误。(
import operator
def already_valid_test(neg):
assert not neg(some_looooooooooooooooong_statement())
already_valid_test(neg=operator.not_) # Should pass
already_valid_test(neg=bool) # Should not pass
注意,这也使用bool内置函数来模拟not not
。
话虽如此,如果我在编写测试,我可能会使用与Samwise相同的代码,因为您不必导入额外的模块。
def already_valid_test(neg):
assert bool(some_looooooooooooooooong_statement()) is not neg
already_valid_test(neg=False) # Should pass
already_valid_test(neg=True) # Should not pass
(我更喜欢Samwise的bool
原始配方,因为我认为它能让你更清楚地测试什么,但这是一个偏好问题。(