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