我想用函数types.CodeType()创建一个新的代码对象.
几乎没有关于这个的文档和现有的文档说"不是为了胆小的"
告诉我我需要什么,并给我一些关于传递给types.CodeType的每个参数的信息,
可能发布一个例子.
注意:
在正常使用情况下,您只需要内置函数compile()
只有当您想要创建无法编写正常源代码并且需要直接访问字节码的新指令时,才应使用types.CodeType().
修补模块中某些内容的最常见方法似乎是使用类似
from unittest.mock import patch
from mypackage.my_module.my_submodule import function_to_test
@patch('mypackage.my_module.my_submodule.fits.open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
Run Code Online (Sandbox Code Playgroud)
然而,由于传递给补丁装饰器的值是一个字符串,我没有从 IDE 中获得很多好处。我无法使用字符串的一部分跳转到定义。我没有得到自动完成(和隐式拼写检查)。也没有完整的重构能力。等等。
使用patch.object我可以更接近我正在寻找的东西。
from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.object(mypackage.my_module.my_submodule.fits, 'open')
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
Run Code Online (Sandbox Code Playgroud)
然而,这仍然要求引用对象的名称的最后部分只是一个字符串。有没有一种(好的)方法可以纯粹根据对该对象的引用来修补该对象?也就是说,我希望能够做类似的事情
from unittest.mock import patch
import mypackage.my_module.my_submodule
from mypackage.my_module.my_submodule import function_to_test
@patch.reference(mypackage.my_module.my_submodule.fits.open)
def test_something(self, mock_fits_open)
# ...
mock_fits_open.return_value = some_return_value
function_to_test()
# ...
Run Code Online (Sandbox Code Playgroud) 我确实了解setattr()python的工作原理,但是我的问题是当我尝试动态设置属性并将其未绑定函数作为值提供时,因此该属性是可调用的,当我使用该属性时,该属性最终会使用未绑定函数的名称调用attr.__name__,而不是属性的名称。
这是一个例子:
我有一Filter堂课:
class Filter:
def __init__(self, column=['poi_id', 'tp.event'], access=['con', 'don']):
self.column = column
self.access = access
self.accessor_column = dict(zip(self.access, self.column))
self.set_conditions()
def condition(self, name):
# i want to be able to get the name of the dynamically set
# function and check `self.accessor_column` for a value, but when
# i do `setattr(self, 'accessor', self.condition)`, the function
# name is always set to `condition` rather than `accessor`
return name
def set_conditions(self):
mapping = list(zip(self.column, …Run Code Online (Sandbox Code Playgroud) python ×3
bytecode ×1
class ×1
mocking ×1
python-3.x ×1
setattr ×1
setattribute ×1
unit-testing ×1