【发布时间】:2020-04-15 20:48:35
【问题描述】:
给定班级
from __future__ import annotations
from typing import ClassVar, Dict, Final
import abc
class Cipher(abc.ABC):
@abc.abstractmethod
def encrypt(self, plaintext: str) -> str:
pass
@abc.abstractmethod
def decrypt(self, ciphertext: str) -> str:
pass
class VigenereCipher(Cipher):
@staticmethod
def rotate(n: int) -> str:
return string.ascii_uppercase[n:] + string.ascii_uppercase[:n]
_TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})
编译失败(使用 3.8.0)
../cipher.py:19: in <module>
class VigenereCipher(Cipher):
../cipher.py:24: in VigenereCipher
_TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})
../cipher.py:24: in <setcomp>
_TABLE: Final[ClassVar[Dict[str, str]]] = dict({(chr(i + ord("A")), rotate(i)) for i in range(26)})
E NameError: name 'rotate' is not defined
但是,根据this 的帖子,rotate 应该是可解析的。请注意,使用类名 VigenereCipher 进行限定也不起作用,因为它找不到 VigenereCipher(这是有道理的,因为我们正在定义它)。
我可以将rotate 设为模块级方法,这很有效,但我真的不想这样做,因为它只在VigenereCipher 中需要。
也试过this回答没有成功。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: python decorator static-methods class-variables python-typing