我在论坛上找过这个,但我能找到任何精确处理functool包装的东西。。。
我有一个类,它有一个函数copyfile和一个decorator文件处理,定义为:
class Sync():
...
def fileprocessing(func):
"decorator for copyfile methods"
@functools.wraps(func)
def wrapped_f(*args):
...#some code invoking copyfile
return wrapped_f
@fileprocessing
def copyfile(self,src, dst, file):
"try copying with shutil file in src folder to dst folder, otherwise with python"
try:
shutil.copy2(f'{src}/{file}',f'{dst}/{file}', follow_symlinks=False)
except Exception as err:
print(err)
self.pythoncopyfile(f'{src}/{file}',f'{dst}/{file}')
我正在尝试用pytest测试这个函数,当它被装饰时,它可以很好地工作。但是,我想测试未修饰的函数。
我放入了我的test_file.py:
def test_undecorated_copyfile():
sync=Sync()
for file in range(3):
sync.copyfile.__wrapped__('source_folder', 'dest_folder', f'{file}.txt')
当我运行pytest时,它会让我">TypeError:copyfile((缺少1个必需的位置参数:"file">
所以我想这与如何处理";自我;在copyfile的争论中,但我不知道从哪里开始了解什么__wrapped___正在执行错误的
我试着在论坛上查看,但我得到的只是如何取消装饰一个函数(用._包装_(,如何在正常情况下处理自己
我不知道如何处理这个错误,也不知道使用哪些对象或方法来调查
所以我想这与如何处理"自我;在copyfile参数中,但我不知道从哪里开始了解
.__wrapped__
在中做了什么错误
你说得很对。
.__wrapped__
属性在这里是一个(未绑定的(函数(而不是方法(
print(sync.copyfile.__wrapped__)
# prints <function Sync.copyfile ...>,
# not <bound method Sync.copyfile of <__main__.Sync object ...>
因此需要一个";自我;显式提供的参数,例如:
# Change
sync.copyfile.__wrapped__('source_folder', 'dest_folder', f'{file}.txt')
# to ↓↓↓↓
sync.copyfile.__wrapped__(sync, 'source_folder', 'dest_folder', f'{file}.txt')