ValueError:找不到子字符串怎么了?

问题描述

    from caesar import Caesar
    from string import ascii_lowercase as lc,ascii_uppercase as uc

    class Vigenere:
        def __init__(self,key: str):
            self.key = key
            self.ignore_chrs = ".,:;!?'- "

        def encode(self,text: str) -> str:
            if len(self.key) > len(text):
                text += text[:len(self.key)-len(text)]
            elif len(text) > len(self.key):
                self.key += self.key[:len(text)-len(self.key)]
            else:
                assert len(self.key) == len(text)
    
            enc_txt = ""
            for _chr in text:
                if _chr in self.ignore_chrs:
                    enc_chr = _chr
                elif _chr.islower():
                    caesar = Caesar(shift=lc.index(self.key[text.index(_chr)]))
                    enc_chr = caesar.encode(_chr)     
                else:
                    caesar = Caesar(shift=uc.index(self.key[text.index(_chr)]))
                    enc_chr = caesar.encode(_chr)
                enc_txt += enc_chr
            return enc_txt 

我使用Caesar(在此代码中没有错误错误。)加密以Vigenere加密进行加密。但是,当我运行代码时,会引发“ ValueError:未找到子字符串”错误。每个字母我也叫“凯撒”课。我可以一次调用“ Caesar”类来操作所有这些代码吗?如果可以的话怎么办?

... \ Desktop \ Python Projects \ vigenere.py”,第25行,编码 凯撒=凯撒(shift = uc.index(self.key [text.index(_chr)])) ValueError:找不到子字符串 这里是。我得到的完整回溯。

解决方法

摘自字符串文档(https://docs.python.org/3/library/stdtypes.html#common-sequence-operations):

当在s中找不到x时,

index引发ValueError

由于我们无法根据您提供的信息告诉您text_chrkey的值,因此我们已经知道了很多。要对此进行调试,您可以使用简单的print()语句打印出上述值并找出不正确的值。

使代码更健壮的另一种方法是更改​​if块。您有一个else块,它实际上不是一个“ else”,因为它处理大写字母。考虑执行以下操作:

elif _chr.isupper():
  caesar = Caesar(shift=uc.index(self.key[text.index(_chr)]))
  enc_chr = caesar.encode(_chr)
else:
  raise ValueError(f'Unexpected character: {_chr}')