使用 .__wrapped__ 测试未修饰的函数给出错误 "requires 1 more positional argument"

testing undecorated function with .__wrapped__ gives error "requires 1 more positional argument"

我在论坛上找过这个,但我能找到任何精确处理包裹的 functool 的东西...... 我有一个 class 函数 copyfile 和 decorator fileprocessing 定义为:

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' “

所以我想这与如何处理复制文件参数中的“自我”有关,但我不知道从哪里开始理解什么.__wrapped__ 做错了

我试图在论坛上查看,但我得到的只是如何取消修饰函数(使用 ._wrapped_ ),如何在正常情况下处理自我。
我不知道如何处理这个错误以及使用哪些对象或方法来调查

So i guess this has something to do with how to handle "self" in the copyfile arguments, but i dont know where to begin with to understand what .__wrapped__ is doing wrong

你完全正确。

.__wrapped__ 属性在这里是一个(未绑定的)函数(不是方法)

print(sync.copyfile.__wrapped__)
#  prints <function Sync.copyfile ...>, 
#  not    <bound method Sync.copyfile of <__main__.Sync object ...>

因此需要明确提供一个“self”参数,例如:

# Change
sync.copyfile.__wrapped__('source_folder', 'dest_folder', f'{file}.txt')

# to                      ↓↓↓↓
sync.copyfile.__wrapped__(sync, 'source_folder', 'dest_folder', f'{file}.txt')