我正在尝试创建一个网页,该网页使用交互式Sage单元格在用户输入的字符串上实现Vigenere Cipher。当我在交互式单元格之外运行时,代码运行完美。见下文:
message = 'Beware the Jabberwock, my son!'
key = 'VIGENERECIPHER'
from itertools import starmap, cycle
def encrypt(message, key):
message = filter(lambda _: _.isalpha(), message.upper())
def enc(c,k): return chr(((ord(k) + ord(c)) % 26) + ord('A'))
return "".join(starmap(enc, zip(message, cycle(key))))
encr = encrypt(message, key)
print encr
但是当我尝试在交互式单元格中实现它时,我会遇到语法错误。
@interact
def f(message = input_box('Beware the Jabberwock, my son!', label ="Plain text"), key = input_box('VIGENERECIPHER', label = "Key word")):
from itertools import starmap, cycle
def encrypt(message, key):
message = filter(lambda _: _.isalpha(), message.upper())
def enc(c,k): return chr(((ord(k) + ord(c)) % 26) + ord('A'))
return "".join(starmap(enc, zip(message, cycle(key))))
encr = encrypt(message, key)
print encr
打印以下错误:
AttributeError: 'exceptions.SyntaxError' object has no attribute 'upper'
我是python / sage的新手...我猜这是类/类型的某种错误?我试过谷歌搜索,但我无法找到与此问题相关的任何内容。谢谢
答案 0 :(得分:2)
我没有看到AttributeError
,而是另一个错误。也许这是同一件事的同义词。在任何情况下,问题是message=input_box(...)
期望在框中使用Python表达式。您应该添加type
关键字:
message=input_box('Beware the Jabberwock, my son!', label ="Plain text", type=str)
(或者,您可以使用显式引号在输入框中输入所有字符串。)