这是我在python 3.6中的代码
class A(object)
def __init__(self, a: str):
self._int_a: int = int(a) # desired composition
def get_int_a(self) -> int:
return self._int_a
Run Code Online (Sandbox Code Playgroud)
我想重写这段代码python 3.7,我如何self._int_a: int = int(a)用dataclasses模块初始化?
我知道我可以做类似的事情,但我不知道如何初始化_a: int = int(a)或类似。
from dataclasses import dataclass
@dataclass
class A(object):
_a: int = int(a) # i want to get initialized `int` object here
def get_int_a(self) -> int:
return self._a
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的想法和建议。
是否可以引用当前在类定义中定义的类?
from dataclasses import dataclass
from typing import List
@dataclass
class Branch:
tree: List[Branch]
Run Code Online (Sandbox Code Playgroud)
错误:
NameError: name 'Branch' is not defined
Run Code Online (Sandbox Code Playgroud) 我想放置__slots__一个带有默认字段的数据类。当我尝试这样做时,我收到此错误:
>>> @dataclass
... class C:
... __slots__ = ('x', 'y', )
... x: int
... y: int = 1
...
Traceback (most recent call last):
File "<input>", line 1, in <module>
ValueError: 'y' in __slots__ conflicts with class variable
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一目标?
定义数据类时 frozen=False(默认行为),然后实例化这个类的一个对象时,有没有办法让这个对象可以散列?
在 Python 3.7 之前,我使用命名元组而不是数据类,我曾经使用 查找重复项set(),但我不能再使用它了。frozen=True由于其他原因,我不想在数据类上使用。
我对使用 dataclass 很感兴趣,因为它的语法比 attr 短。但是,我找不到提供 API 来改进它的快捷方式,例如使用以下代码:
@dataclass
class AB(object):
a: int = 1
b: int = 2
AB().evolve(b=3)
result = AB(a=1, b=3)
Run Code Online (Sandbox Code Playgroud)
是否容易找到开箱即用的替代品?还是自己实施?
我正在使用dataclassand asdictfrom dataclasses,我发现这asdict在我引入继承时并不像我期望的那样工作。
我dataclasses用来帮助我从类创建字典,以便我可以将它们传递到django.shortcuts.render.
from dataclasses import dataclass
from dataclasses import asdict
@dataclass
class Base:
name: str
class Test(Base):
def __init__(self, age, *args, **kwargs):
self.age = age
super(Test, self).__init__(*args, **kwargs)
test = Test(age=20, name="john doe")
print(asdict(test))
Run Code Online (Sandbox Code Playgroud)
我希望输出是
{"age": 20, "name": "john doe"}
Run Code Online (Sandbox Code Playgroud)
但我得到的只是来自基类的关键字值
{"name": "john doe"}
Run Code Online (Sandbox Code Playgroud) 我有一个具有 5 个属性的数据类。当我通过字典给出这些属性时,效果很好。但是当字典的属性多于类的属性时,类会给出 TypeError。我试图让当有额外的值时,类不会关心它们。我怎样才能做到这一点?
\n\nfrom dataclasses import dataclass\n\n@dataclass\nclass Employee(object):\n name: str\n lastname: str\n age: int or None\n salary: int\n department: str\n\n def __new__(cls, name, lastname, age, salary, department):\n return object.__new__(cls)\n\n def __post_init__(self):\n if type(self.age) == str:\n self.age = int(self.age) or None\n\n def __str__(self):\n return f\'{self.name}, {self.lastname}, {self.age}\' \n\ndic = {"name":"abd\xc3\xbclmutallip", \n"lastname":"uzunkavaka\xc4\x9fac\xc4\xb1alt\xc4\xb1ndauzan\xc4\xb1ro\xc4\x9flu", \n"age":"24", "salary":2000, "department":"\xc4\xb0K", \n"city":"istanbul", "country":"tr", "adres":"yok", "phone":"0033333"}\n\na = Employee(**dic)\nprint(a)\nRun Code Online (Sandbox Code Playgroud)\n\n错误是:
\n\nTypeError: __new__() got an unexpected keyword argument \'city\'\nRun Code Online (Sandbox Code Playgroud)\n\n我希望该类在这种情况下正常工作,没有任何错误。我不想将这些额外的属性添加到类中。
\n我正在尝试编写pydanticvalidators,但我似乎无法理解如何使用kwargs文档中提到的参数。我想传递条件参数进行验证。这是一个玩具示例:
from pydantic import validator
import pydantic.dataclasses as pyd_dc
@pyd_dc.dataclass
class Point_t:
x: int = 0
y: int = 1
@validator("y")
def quadrant(cls, val, values, **kwargs):
pt = x, y = values.get("x", None), val
if x is None:
raise ValueError(f"invalid point: {x}, {y}")
signs = kwargs.get("signs", None)
if signs is None:
raise ValueError("'signs' parameter missing")
if all(c * s >= 0 for c, s in zip(pt, signs) if s != 0):
return val
raise ValueError(f"{pt} …Run Code Online (Sandbox Code Playgroud) Python数据类实例还包括一个字符串表示方法,但是当类具有多个字段和/或更长的字段值时,它的结果对于漂亮的打印目的来说并不足够。
基本上,我正在寻找一种方法来自定义默认的数据类字符串表示例程,或者寻找一种理解数据类并更漂亮地打印它们的漂亮打印机。
所以,这只是我想到的一个小自定义:在每个字段之后添加一个换行符,同时在第一个字段之后缩进行。
例如,代替
x = InventoryItem('foo', 23)
print(x) # =>
InventoryItem(name='foo', unit_price=23, quantity_on_hand=0)
Run Code Online (Sandbox Code Playgroud)
我想得到这样的字符串表示:
x = InventoryItem('foo', 23)
print(x) # =>
InventoryItem(
name='foo',
unit_price=23,
quantity_on_hand=0
)
Run Code Online (Sandbox Code Playgroud)
或者类似的。也许漂亮的打印机可以变得更漂亮,例如对齐=分配字符或类似的东西。
当然,它也应该以递归方式工作,例如,也是数据类的字段应该缩进更多。
我正在通过继承asyncio.Future一些自定义属性来创建一个作业类,并期望作业实例的功能与原始 Future 类似。
当我job.set_result在协程内部调用时,它会引发 a Future object is not initialized error,然后我尝试通过调用初始化 futureasyncio.ensure_future并出现相同的错误。
我尝试了更多,发现未来通常是由 创造的loop.create_future(),但是,没有选项来创建我的自定义未来。
下面是一个示例,如何初始化我的自定义未来?
import asyncio
from dataclasses import dataclass
@dataclass
class Job(asyncio.Future):
job_task: Callable
real_future: asyncio.Future = None
something: str = None
def schedule(self):
async def run():
res = await self.job_task()
self.set_result(res) # raise error, future not initialized
return res
self.real_future = asyncio.ensure_future(run())
async def main():
async def task():
await asyncio.sleep(1)
return 1
job = Job(task)
job.schedule()
await job …Run Code Online (Sandbox Code Playgroud) python ×9
python-3.x ×3
python-3.7 ×2
inheritance ×1
pretty-print ×1
pydantic ×1
typing ×1
validation ×1