gpt4 book ai didi

python - 如何显示使用@dataclass 类装饰器时生成的代码?

转载 作者:太空狗 更新时间:2023-10-30 00:15:47 26 4
gpt4 key购买 nike

Python 3.7 引入了包含 @dataclass 装饰器的 dataclasses 模块。这个装饰器可以生成类函数。如何打印这些生成的函数?

最佳答案

我自己也问过同样的问题。 Dataclasses part project 应该有 verbose 选项,但没有。

发现这个video ,有帮助。根据视频 dataclasses.py 是一个代码生成器。所以这应该是我们如何获取代码的第一个想法。


我试过这段代码:

from dataclasses import dataclass
import inspect
import os
from uncompyle6 import PYTHON_VERSION, deparse_code2str

@dataclass
class C:
name: str
value: int = 34

inspect.getmembers(C) #('__init__', <function __init__(self, name: str, value: int = 34) -> None>)

co= C.__init__.__code__ # let's find out code for the __init__ method from code object

code = deparse_code2str(
code=co,
version=PYTHON_VERSION,
out=open(os.devnull, "w"))
print(code)

将打印

self.name = name
self.value = value

代码实际上使用检查器来理解类,然后使用 Python 反编译器反编译方法。

这里是发现的方法:

def __eq__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.value) == (
other.name,
other.value,
)
else:
return NotImplemented

def __init__(self, name: str, value: int = 34) -> None:
self.name = name
self.value = value

def __repr__(self):
key = (id(self), _thread.get_ident())
if key in repr_running:
return "..."
else:
repr_running.add(key)
try:
result = user_function(self)
finally:
repr_running.discard(key)

return result

实际上有一个project那是在做@dataclass 发现。我安装了它并且运行良好。

from dataclasses import dataclass
import inspect
import os
import dis
from DataclassInspector.inspector import Inspector

@dataclass
class C:
name: str
value: int = 34

inspected = Inspector(C)
print(inspected._generate_code())

提供这样的输出:

from dataclasses import Field, _MISSING_TYPE, _DataclassParams
class C:
__dataclass_fields__ = {'name': "Field(name='name', type=str, default=_MISSING_TYPE, default_factory=_MISSING_TYPE, init=True, repr=True, hash=None, compare=True, metadata={}, _field_type=_FIELD)", 'value': "Field(name='value', type=int, default=34, default_factory=_MISSING_TYPE, init=True, repr=True, hash=None, compare=True, metadata={}, _field_type=_FIELD)"}
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)
name: str
value: int = 34

def __eq__(self, other):
if other.__class__ is self.__class__:
return (self.name, self.value) == (other.name, other.value)
else:
return NotImplemented


__hash__ = None

def __init__(self, name: str, value: int = 34) -> None:
self.name = name
self.value = value



def __repr__(self):
key = (
id(self), _thread.get_ident())
if key in repr_running:
return '...'
else:
repr_running.add(key)
try:
result = user_function(self)
finally:
repr_running.discard(key)

return result

关于python - 如何显示使用@dataclass 类装饰器时生成的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com