Python 自定义类atributes的类型提示

Python 自定义类atributes的类型提示,python,types,hint,Python,Types,Hint,我对在python中使用类型提示非常陌生。我有一个应用程序,它在一个包中包含多个模块以及与之相关的类。我一直在试图找到一些类型提示解释,当有多个脚本并且定义的类型来自另一个模块中加载脚本的对象时,它是如何工作的。 下面是一个非常简化的版本,用于解决类型提示使用上的混乱 假设主应用程序有这样一个脚本: from modules.FigureFormatter import FigureFormatter from modules.Plotter import Plotter class Main

我对在python中使用类型提示非常陌生。我有一个应用程序,它在一个包中包含多个模块以及与之相关的类。我一直在试图找到一些类型提示解释,当有多个脚本并且定义的类型来自另一个模块中加载脚本的对象时,它是如何工作的。 下面是一个非常简化的版本,用于解决类型提示使用上的混乱

假设主应用程序有这样一个脚本:

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}}


plot\u figure
方法中的
styler
参数的类型提示应该是什么?本质上它是一本字典。显然,它不应该是任何字典,而是一个字典,它是
FigureFormatting
类实例的属性。该模块是否也应导入到
绘图仪
模块中,以便可以引用类名?

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
用作基类,文档建议使用它。(调用的版本似乎支持Python 3.6之前的版本,该版本不允许变量注释。请注意,
TypedDict
在升级到
typing
之前处于实验性的
typing\u扩展中)


进一步要求dict来自特定的class属性没有多大意义,因为属性所引用的dict不会改变
dict
值。如果作为
FigureFormatter
的属性很重要,那么只需要
FigureFormatter
的一个实例,然后自己提取
dict

def plot_figure(self, f: FigureFormatter):
    styler = f.styler
    ...

这似乎应该在
FigureFormatter
模块中,而不是调用程序中,以便在对类进行更改时可以更新类型。在Python 3.8.5中,我在通过Pycharm 2021.1和mypy 0.812(最新版本)传递给
TypedDict
的任何参数上都会得到
意外参数我为这些参数传递的类型似乎没有影响。如果它不明显,我自己从未使用过它,只知道它被添加到了
键入
模块。:)文档表明这种用法是合法的,但也可以将其用作基类,每个键都被指定为一个带注释的类属性。我不确定mypy的问题是什么(我对PyCharm的期望很低)。我愿意将其作为一个社区wiki,或者在我之前听从能够解决这个问题的人。你能澄清一下你到底想要类型提示表达什么吗?“作为FigureFormatting类实例属性的字典”不是类型。如果希望
plot\u figure
访问“作为figureFormat类实例属性的字典”,为什么不传入
formatter:FigureFormatter
并访问其
样式器
属性呢?
class StylerProperties(TypedDict):
    prop1: int
    prop2: int


class Styler(TypedDict):
    light: StylerProperties
    dark: StylerProperties
def plot_figure(self, f: FigureFormatter):
    styler = f.styler
    ...