TypeError: _transform() 接受 2 个位置参数,但给出了 3 个

Posted

技术标签:

【中文标题】TypeError: _transform() 接受 2 个位置参数,但给出了 3 个【英文标题】:TypeError: _transform() takes 2 positional arguments but 3 were given 【发布时间】:2018-12-17 13:35:40 【问题描述】:

我学会了凯撒密码:

In [90]: !cat caesar_cipher.py                                                                                                                        
class CaesarCipher:
    """Construct Caesar cipher using given integer shift for rotation."""
    def __init__(self, shift):
        encoder = [None] * 26
        decoder = [None] * 26
        for k in range(26):
            encoder[k] = chr((k + shift)%26 + ord('A'))
            decoder[k] = chr((k - shift)%26 + ord('A'))  #find the number of Letters
        self.encoder = "".join(encoder)
        self.decoder = "".join(decoder)

    def encrypt(self, message):
        print(self.encoder)
        return self._transform(message, self.encoder)

    def decrypt(self, message):
        return self._transform(message, self.decoder)

    def _transform(original, code):
        msg = list(original)
        for k in range(len(msg)):
            j = ord(msg[k]) - ord('A')
            msg[k] = code[j]
        return "".join(msg)

if __name__ == "__main__":
    cipher = CaesarCipher(3)
    message = "THE EAGLE IS IN PLAY; MEET AT JOE'S."
    coded = cipher.encrypt(message)
    print("Secret: ", coded)
    answer = cipher.decrypt(coded)
    print("Message: ", answer)

_trasform报错

In [91]: !python caesar_cipher.py                                                                                                                     
DEFGHIJKLMNOPQRSTUVWXYZABC
Traceback (most recent call last):
  File "caesar_cipher.py", line 29, in <module>
    coded = cipher.encrypt(message)
  File "caesar_cipher.py", line 14, in encrypt
    return self._transform(message, self.encoder)
TypeError: _transform() takes 2 positional arguments but 3 were given

“_transform() 接受 2 个位置参数”,我确实给出了 2 个参数

为什么给出报告 3?

【问题讨论】:

使用 @staticmethod 装饰器使用静态方法定义 _transform。 【参考方案1】:

您需要将其定义为

def _transform(self, original, code)

【讨论】:

【参考方案2】:

你必须首先添加self参数,比如

def _transform(self, original, code)...

或者您也可以将其设为静态方法。

@staticmethod
def _transform(original, code)...

【讨论】:

【参考方案3】:

CaesarCipher 类中不需要有_transform() 方法,因为它是一个无状态 方法(因为它不使用实例变量)并且它有与 Ceasar 密码没有特别的关系 - 它是一种通用字符替换密码。

因此您可以将其定义为 常规函数(在任何类之外)而不是命令

return self._transform(message, self.encoder)
return self._transform(message, self.decoder)

(在您的 encrypt() and decrypt() 方法中)使用

return transform(message, self.encoder)
return transform(message, self.decoder)

【讨论】:

以上是关于TypeError: _transform() 接受 2 个位置参数,但给出了 3 个的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“TypeError:fit_transform() 需要 2 个位置参数,但给出了 3 个”

TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个

Sklearn - FeatureUnion - Transformer: TypeError: fit_transform() 接受 2 个位置参数,但给出了 3 个

测试无法运行测试用例退出 TypeError: Jest: a transform must export a `process` function

TypeError尝试标记编码用户输入数据时

gulp打字稿时的TypeError