自定义 class 属性的类型提示
Type hint for custom class atributes
我对在 python 中使用类型提示还很陌生。我有一个应用程序,在一个包中包含多个模块,并且 classes 与它们相关联。我一直在尝试寻找一些类型提示解释当有多个脚本时它是如何工作的,并且定义的类型来自一个对象,该对象的脚本加载到另一个模块中。
这是一个非常简化的版本,用于解决类型提示使用上的这种混淆。
鉴于主应用程序有这样一个脚本:
from modules.FigureFormatter import FigureFormatter
from modules.Plotter import Plotter
class MainApp:
def __init__(self):
formatter = FigureFormatter()
plotter = Plotter()
plotter.plot_figure(formatter.styler['light'])
模块包包含两个模块:
class FigureFormatter:
def __init__(self):
self.styler = {'light': {'prop1': 1,
'prop2': 2},
'dark': {'prop1': 1,
'prop2': 2}}
和
from typing import Dict
class Plotter:
def __inti__(self):
# Some initialization stuff
pass
def plot_figure(self, styler: Dict):
# Plotting figure
pass
plot_figure
方法中 styler
参数的类型提示应该是什么?本质上它是一本字典。显然它不应该是任何字典,而是作为 FigureFormatting
class 实例属性的字典。该模块是否也应该导入到 Plotter
模块中,以便可以引用 class 名称?
Python 3.8 引入了一个 TypedDict
提示,它可以指定一个字典,其中包含映射到特定类型的特定 str
值键。例如:
# In modules.FigureFormatter
from typing import TypedDict
StylerProperties = TypedDict('StylerProperties', prop1=int, prop2=int)
StylerType = TypedDict('Styler', light=StylerProperties, dark=StylerProperties)
# In modules.Plotter
from modules.Formatter import StylerType
class Plotter:
...
def plot_figure(self, styler: StylerType):
...
您也可以将它 TypedDict
用作基础 class,文档建议这是预期用途。 (被调用的版本似乎存在支持 3.6 之前的 Python 版本,这些版本不允许变量注释。请注意 TypedDict
在升级为 [= 之前处于实验性 typing_extensions
18=].)
class StylerProperties(TypedDict):
prop1: int
prop2: int
class Styler(TypedDict):
light: StylerProperties
dark: StylerProperties
进一步要求字典来自特定的 class 属性没有多大意义,因为被属性引用不会改变 dict
值。如果作为 FigureFormatter
的属性很重要,那么只需要一个 FigureFormatter
的实例并自己提取 dict
:
def plot_figure(self, f: FigureFormatter):
styler = f.styler
...
我对在 python 中使用类型提示还很陌生。我有一个应用程序,在一个包中包含多个模块,并且 classes 与它们相关联。我一直在尝试寻找一些类型提示解释当有多个脚本时它是如何工作的,并且定义的类型来自一个对象,该对象的脚本加载到另一个模块中。 这是一个非常简化的版本,用于解决类型提示使用上的这种混淆。
鉴于主应用程序有这样一个脚本:
from modules.FigureFormatter import FigureFormatter
from modules.Plotter import Plotter
class MainApp:
def __init__(self):
formatter = FigureFormatter()
plotter = Plotter()
plotter.plot_figure(formatter.styler['light'])
模块包包含两个模块:
class FigureFormatter:
def __init__(self):
self.styler = {'light': {'prop1': 1,
'prop2': 2},
'dark': {'prop1': 1,
'prop2': 2}}
和
from typing import Dict
class Plotter:
def __inti__(self):
# Some initialization stuff
pass
def plot_figure(self, styler: Dict):
# Plotting figure
pass
plot_figure
方法中 styler
参数的类型提示应该是什么?本质上它是一本字典。显然它不应该是任何字典,而是作为 FigureFormatting
class 实例属性的字典。该模块是否也应该导入到 Plotter
模块中,以便可以引用 class 名称?
Python 3.8 引入了一个 TypedDict
提示,它可以指定一个字典,其中包含映射到特定类型的特定 str
值键。例如:
# In modules.FigureFormatter
from typing import TypedDict
StylerProperties = TypedDict('StylerProperties', prop1=int, prop2=int)
StylerType = TypedDict('Styler', light=StylerProperties, dark=StylerProperties)
# In modules.Plotter
from modules.Formatter import StylerType
class Plotter:
...
def plot_figure(self, styler: StylerType):
...
您也可以将它 TypedDict
用作基础 class,文档建议这是预期用途。 (被调用的版本似乎存在支持 3.6 之前的 Python 版本,这些版本不允许变量注释。请注意 TypedDict
在升级为 [= 之前处于实验性 typing_extensions
18=].)
class StylerProperties(TypedDict):
prop1: int
prop2: int
class Styler(TypedDict):
light: StylerProperties
dark: StylerProperties
进一步要求字典来自特定的 class 属性没有多大意义,因为被属性引用不会改变 dict
值。如果作为 FigureFormatter
的属性很重要,那么只需要一个 FigureFormatter
的实例并自己提取 dict
:
def plot_figure(self, f: FigureFormatter):
styler = f.styler
...