- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的代码:
class A():
def __init__(self, a):
self.a = a
def outer_method(self):
def inner_method():
return self.a +1
return inner_method()
我想为 inner_method
编写测试。为此,我使用了这样的代码:
def find_nested_func(parent, child_name):
"""
Return the function named <child_name> that is defined inside
a <parent> function
Returns None if nonexistent
"""
consts = parent.__code__.co_consts
item = list(filter(lambda x:isinstance(x, CodeType) and x.co_name==child_name, consts ))[0]
return FunctionType(item, globals())
使用 find_nested_func(A().outer_method, 'inner_method')
调用它,但在调用 'FunctionType' 时失败,因为无法创建函数,因为 'self.a' 不再存在于函数不再是内部函数的时刻。我知道构造 FunctionType 可以接收一个可以解决此问题的闭包作为参数,但我不知道如何使用它。我怎样才能通过它?
它给出的错误是下一个:
return FunctionType(item, globals())
TypeError: arg 5 (closure) must be tuple
最佳答案
为什么要测试 inner_method
?在大多数情况下,您应该只测试公共(public) API 的一部分。 outer_method
是 A
的公共(public) API 的一部分,所以只测试它。 inner_method
是一个可以更改的实现细节:如果您决定重命名它怎么办?如果您在不修改 outer_method
的外部可见行为的情况下稍微重构它会怎样? A
类的用户无法(轻松)调用 inner_method
。单元测试通常只用于测试您类(class)的用户可以调用的东西(我假设这些是用于单元测试的,因为这种粒度的集成测试会很奇怪——同样的原则仍然大部分成立)。
实际上,提取在另一个函数范围内定义的函数时会遇到问题,原因有多种,包括变量捕获。您无法知道 inner_method
是否仅捕获 self
或 outer_method
是否执行一些逻辑并计算一些变量 inner_method
使用。例如:
class A:
def outer_method():
b = 1
def inner_method():
return self.a + b
return inner_method()
此外,您可以在函数定义周围使用控制语句,因此如果不运行 outer_method
就无法决定使用哪个定义。例如:
import random
class A:
def outer_method():
if random.random() < 0.5:
def inner_method():
return self.a + 1
else:
def inner_method():
return self.a + 2
return inner_method()
您不能在此处提取 inner_method
,因为它们有两个,并且在运行 outer_method
之前您不知道实际使用了哪个。
所以,不要测试 inner_method
。
如果 inner_method
真的足够复杂以至于您想单独测试它(如果您这样做,原则性测试说您应该模拟它的用途,例如它在 outer_method 中的使用
),然后将其设为 A
上的“private-ish”方法:
class A:
def _inner_method(self):
return self.a + 1
def outer_method(self):
return self._inner_method()
有原则的测试说你真的不应该测试下划线方法,但有时需要这样做。这样做可以让您像测试任何其他方法一样测试 _inner_method
。然后,在测试 outer_method
时,您可以通过执行 a._inner_method = Mock()
来模拟它(其中 a
是 A
被测对象)。
此外,使用 A 类
。 parens 是不必要的,除非你有父类。
关于python - 在函数中将闭包传递给 FunctionType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55282608/
我有这样的代码: class A(): def __init__(self, a): self.a = a def outer_method(self):
我想在不将 type(testObject) 更改为 FunctionType 的情况下实现以下功能: import functools class TestClass(object): de
我正在努力加强我的 Python 技能,我遇到了 Open-Source code for Saltstack那是使用types.FunctionType,我不明白发生了什么。 salt.cloud.
我正在尝试使用 python 检查模块检查源代码。我在本例中检查的代码示例是: class xxx: def __init__(self): pass def xxxm
我正在尝试对嵌套函数(函数内部的函数)进行单元测试,我正在使用下面链接中的代码(“嵌套”是函数名称),它将提供闭包并返回可从测试中调用的有效函数。它适用于简单的功能。我试图让它适用于递归函数。 举个例
我对基于 https://stackoverflow.com/a/10303539/4113228 的代码片段有疑问 当我尝试编译时: import types dynf = types.Functi
在我的代码中,我需要检测变量是否是函数并对其执行一些操作。 一切都很顺利,直到我现在使用 functools 创建了一个部分函数,突然我的一些测试失败了: import types import
如果是直接调用函数,可以通过以下代码获取Function类型。 Function * fun = callInst->getCalledFunction(); Function * funTyp
我们可以转换llvm::FunctionType的对象转换为 C/C++ 风格的函数原始指针? C/C++ 风格的函数原始指针示例:uint64_t (*funPtr)(uint64_t* args)
使用 types.FunctionType 有哪些缺点或好处?对比typing.Callable作为类型提示注释? 考虑以下代码... import types import typing def f
免责声明:我知道我正在做的事情可能永远永远不会在真实程序中完成。 我最近刚刚了解了 python 的 types.CodeType 和 types.FunctionType,这让我对通过这些类手动创建
我是一名优秀的程序员,十分优秀!