我一直在使用python中的一个简单的Caesar Shift,但是当我尝试运行它时它说:
File "Ceaser Shift.py", line 36, in main
ciphertext += shift(letter,shift)
TypeError: 'str' object is not callable
我试图找出它为什么这样做,我可以在正常的IDLE环境中添加一个字符串,并且没有看到任何在线相关的东西,因为我没有在我的脚本中的任何地方重新定义str。 任何帮助都会很棒!
我的代码:
## Doesn't support changing shifts during computation, to do this either the database must be re-written or script restarted
import time, os, string
global selmemo
shiftmemo = {}
def shift(l,shift):
if l not in shiftmemo:
charset = list(string.ascii_lowercase)
place = charset.index(l.lower())
shiftplace = charset.index(shift.lower())
shiftmemo[l] = charset[(place+shiftplace)%25]
return shiftmemo[l]
def main():
shift = None
ciphertext = ""
print("--- Welcome ---")
print("--- Ceaser Shifter ---")
print("Commands: shift, encrypt, clear, print, quit")
choice = input(": ")
while choice != "quit":
if choice == "shift":
shift = input("Please enter a shift letter: ")
elif choice == "encrypt" and shift != None:
uparse = input("Enter your plaintext: ")
for letter in uparse:
if letter.lower() in string.ascii_lowercase:
ciphertext += shift(letter,shift)
else:
ciphertext += letter
elif choice == "clear":
shift = ""
ciphertext = ""
shiftmemo = {}
elif choice == "print":
print(ciphertext)
else:
pass
choice = input(": ")
main()
答案 0 :(得分:1)
问题在于您定义了函数shift
和字符串变量shift
。
快速解决方法是重命名您的函数和变量,以便不会发生冲突。
答案 1 :(得分:0)
shift
只是名字。它是由解释器识别为用户定义函数的名称的值。因此,您可以通过将值分配给另一个名称来使用此类函数:
>>> def func():
... print('a')
...
>>> f = func
>>> f()
a
>>>
但是如果你为名字指定一个新值,它可能不再是一个函数。
>>> func = None
>>> type(func)
<class 'NoneType'>
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>>>