首页 > 编程问答 >Python字段的字符串注释

Python字段的字符串注释

时间:2024-07-23 11:51:17浏览次数:16  
标签:python

Python 是否支持类字段的任何类型的字符串注释? 例如,在Golang中,我可以定义这样的结构,带有可选的字符串标签:

type User struct {
    Name string `example:"name"`
}

我需要在Python中定义一个新类,其中包含包含点 . 的字段名称。 我希望可能有某种方法来注释字段,或者以相同的方式定义“标签”,以便当访问并写出字段时,它将(或可以)显示点注释。

这在 Python 中显然是不允许的:

class MyNetworkClass(TypedDict):
    network.client.ip: str
    network.client.port: int

所以我需要一个可以定义有效字段名称的类,但返回点注释。

所以我需要类似下面的内容,具有有效的字段名称,但是某种标签/注释/标签/任何...

class MyNetworkClass(TypedDict):
    network_client_ip: str "network.client.ip"
    network_client_port: int "network.client.port"

注意,我不是在寻找点注释作为字段的 ,而是字段名称的输出字符串打印时。


Python 没有对字段名称添加字符串注释的内置方法,就像 Golang 中那样。Python 中的变量和类成员名称不能包含点字符 (.)。

不过,可以通过以下几种方法实现类似的功能:

1. 使用字典和自定义 __getattr__ __setattr__ 方法:

class MyNetworkClass:
    def __init__(self):
        self._data = {}

    def __getattr__(self, name):
        # 将点符号转换为下划线符号
        name = name.replace(".", "_")
        return self._data.get(name)

    def __setattr__(self, name, value):
        if name != "_data":
            # 将点符号转换为下划线符号
            name = name.replace(".", "_")
            self._data[name] = value
        else:
            super().__setattr__(name, value)

# 示例用法
network = MyNetworkClass()
network.network.client.ip = "192.168.1.1"
print(network.network_client_ip)  # 输出: 192.168.1.1

在这个例子中,我们使用下划线 _ 存储字段名称,并在 __getattr__ __setattr__ 方法中进行转换。这样你就可以使用点符号访问属性,但实际存储的键名是使用下划线的。

2. 使用自定义类和注解:

class Field:
    def __init__(self, label):
        self.label = label

class MyNetworkClass:
    network_client_ip = Field("network.client.ip")
    network_client_port = Field("network.client.port")

# 示例用法
network = MyNetworkClass()
print(network.network_client_ip.label)  # 输出: network.client.ip

这里我们定义了一个 Field 类来存储标签信息,并将类的属性定义为 Field 实例。

3. 使用元类动态创建类属性:

class MyMetaClass(type):
    def __new__(cls, name, bases, attrs):
        new_attrs = {}
        for key, value in attrs.items():
            if isinstance(value, str):
                # 使用字符串值作为标签创建 Field 实例
                new_attrs[key] = Field(value)
            else:
                new_attrs[key] = value
        return super().__new__(cls, name, bases, new_attrs)

class MyNetworkClass(metaclass=MyMetaClass):
    network_client_ip: "network.client.ip" = str
    network_client_port: "network.client.port" = int

# 示例用法
network = MyNetworkClass()
print(network.network_client_ip.label)  # 输出: network.client.ip

这里我们使用元类在创建类时动态地将字符串注释转换为 Field 实例。

这些方法都可以实现类似的功能,具体选择哪种方法取决于的具体需求和编码风格。

标签:python
From: 76119231

相关文章

  • 具有未定义变量和注释的有效 Python 行
    我来了一篇文章,其中包含未定义的变量名称和某些类型注释。该行有效。它有什么作用以及可能的用途是什么?withundefinedvariablenamewithsometypeannotation.Thelineisvalid.Whatitdoesandwhatarepossibleusages?>>>x:int>>>xTraceback(mostr......
  • 使用 Python 通过逻辑应用运行长时间运行的 Azure Functions
    我已经尝试解决这个问题有一段时间了,但我似乎找不到解决方案。因此,正如标题所示,我试图通过函数在逻辑应用程序中运行长时间运行的操作。我有一个python代码,可以比较2个excel文件并进行一些转换。它工作正常,但是,Excel文件包含近20k行(它是动态的,将来会添加更多行),因此......
  • 使用递归函数计算阶乘时,我在 python 中遇到类型错误
    defcalc_fact(n):如果(n==1或n==0):返回1别的:n*calc_fact(n-1)print(calc_fact(5))试图创建函数来计算阶乘,不支持类型错误操作数*:对于int或Nonetype我不知道为什么谢谢Python代码中出现“类型错误:不支持的操作数类型为*:'int'和'NoneType'”表明你......
  • 如何调试 python Flask [84] [CRITICAL] WORKER TIMEOUT?
    调试:gtts.tts:保存到temp.mp37月22日09:10:56PM[2024-07-2215:40:56+0000][84][严重]工作超时(pid:87)|||7月22日09:10:56PM[2024-07-2215:40:56+0000][87][INFO]工人退出(pid:87)7月22日09:10:57PM[2024-07-2215:40:57+0000][95][INF......
  • 类型错误:无法将函数返回值转换为 Python 类型!签名是 () -> 处理 anaconda spider
    这是代码:importosimportrandomimportnumpyasnpimportpandasaspdimporttensorflowastffromtensorflow.kerasimportbackendasKfromtensorflow.keras.layersimportDense,Dropout,Flatten,Conv2D,MaxPool2D,Input......
  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......