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