相关疑难解决方法(0)

将嵌套的Python dict转换为对象?

我正在寻找一种优雅的方法,使用一些嵌套的dicts和列表(即javascript样式的对象语法)在dict上使用属性访问来获取数据.

例如:

>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
Run Code Online (Sandbox Code Playgroud)

应该可以通过这种方式访问​​:

>>> x = dict2obj(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
bar
Run Code Online (Sandbox Code Playgroud)

我认为,如果没有递归,这是不可能的,但是什么是获得dicts的对象样式的好方法?

python dictionary object

509
推荐指数
20
解决办法
23万
查看次数

像属性一样访问dict键?

我发现访问dict密钥更加方便,obj.foo而不是obj['foo'],所以我写了这个代码片段:

class AttributeDict(dict):
    def __getattr__(self, attr):
        return self[attr]
    def __setattr__(self, attr, value):
        self[attr] = value
Run Code Online (Sandbox Code Playgroud)

但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问​​dict密钥有什么警告和陷阱?

python syntax dictionary

273
推荐指数
16
解决办法
16万
查看次数

在Python中是否存在可变的命名元组?

任何人都可以修改namedtuple或提供替代类,以便它适用于可变对象吗?

主要是为了可读性,我想要类似于namedtuple这样做:

from Camelot import namedgroup

Point = namedgroup('Point', ['x', 'y'])
p = Point(0, 0)
p.x = 10

>>> p
Point(x=10, y=0)

>>> p.x *= 10
Point(x=100, y=0)
Run Code Online (Sandbox Code Playgroud)

必须可以腌制生成的对象.并且根据命名元组的特征,当表示时,输出的排序必须与构造对象时参数列表的顺序相匹配.

python mutable namedtuple

105
推荐指数
6
解决办法
3万
查看次数

什么是数据类,它们与普通类有什么不同?

使用PEP 557,数据类被引入到python标准库中.

他们使用@dataclass装饰器,他们应该是"默认的可变的命名元组",但我不确定我理解这实际意味着什么,以及它们与普通类的区别.

究竟什么是python数据类以及何时最好使用它们?

python class python-3.7 python-dataclasses

82
推荐指数
5
解决办法
3万
查看次数

namedtuple和NamedTuple有什么区别?

typing模块的文件说,下面的两段代码是等效的.

from typing import NamedTuple

class Employee(NamedTuple):
    name: str
    id: int
Run Code Online (Sandbox Code Playgroud)

from collections import namedtuple

Employee = namedtuple('Employee', ['name', 'id'])
Run Code Online (Sandbox Code Playgroud)

它们是完全相同的,如果不是,两个实现之间有什么区别?

python python-3.x

41
推荐指数
1
解决办法
2451
查看次数

数据类与typing.NamedTuple主要用例

长话短说

PEP-557引入了数据类到Python标准库,基本上可以填补因为同样的作用collections.namedtupletyping.NamedTuple.现在我想知道如何分离使用namedtuple仍然是更好的解决方案的用例.

数据类优于NamedTuple

当然,dataclass如果我们需要,所有的功劳都归功于:

  • 可变对象
  • 继承支持
  • property 装饰器,可管理的属性
  • 生成的方法定义开箱即用或可自定义的方法定义

在同一个PEP中简要解释了数据类的优点:为什么不使用namedtuple.

问:在哪些情况下,namedtuple仍然是更好的选择?

但是对于namedtuples这个相反的问题怎么样:为什么不使用dataclass呢?我想从性能的角度来看,名字元组可能更好,但尚未确认.

让我们考虑以下情况:

我们将页面维度存储在一个小容器中,该容器具有静态定义的字段,类型提示和命名访问.不需要进一步散列,比较等.

NamedTuple方法:

from typing import NamedTuple

PageDimensions = NamedTuple("PageDimensions", [('width', int), ('height', int)])
Run Code Online (Sandbox Code Playgroud)

DataClass方法:

from dataclasses import dataclass

@dataclass
class PageDimensions:
    width: int
    height: int
Run Code Online (Sandbox Code Playgroud)

哪种解决方案更可取,为什么?

PS这个问题不是以任何方式重复那个问题,因为我在这里询问是哪个命名元组更好,而不是区别(我在询问之前检查了文档和来源)

python pep namedtuple python-3.7 python-dataclasses

19
推荐指数
6
解决办法
3535
查看次数

子类化Python namedtuple

Python的namedtuple作为一个轻量级,不可变的数据类非常有用.我喜欢将它们用于簿记参数而不是字典.当需要更多功能时,例如简单的文档字符串或默认值,您可以轻松地将namedtuple重构为类.但是,我已经看到继承自namedtuple的类.他们获得了什么功能,他们失去了什么表现?例如,我会将其实现为

from collections import namedtuple

class Pokemon(namedtuple('Pokemon', 'name type level')):
    """
    Attributes
    ----------
    name : str
        What do you call your Pokemon?
    type : str
        grass, rock, electric, etc.
    level : int
        Experience level [0, 100]
    """
     __slots__ = ()
Run Code Online (Sandbox Code Playgroud)

唯一的目的是能够干净地记录attrs,并__slots__用于防止创建__dict__(保持namedtuples的轻量级特性).

是否有更好的建议使用轻量级数据类来记录参数?注意我使用的是Python 2.7.

python namedtuple

12
推荐指数
1
解决办法
7325
查看次数

如何从另一个命名元组推导或子类型命名元组?

前言

\n\n

我想知道如何以Python方式概念化数据类。\n特别是我\xe2\x80\x99m 谈论 DTO(数据传输对象)。

\n\n

我在 @jeff-oneill 问题 \xe2\x80\x9c使用 Python 类作为数据容器\xe2\x80\x9d 中找到了一个很好的答案,其中 @joe-kington 很好地使用了内置namedtuple.

\n\n

问题

\n\n

在 python 2.7 文档的第 8.3.4 节中,有一个关于如何组合多个命名元组的很好的示例。\n我的问题是如何实现相反的效果?

\n\n

例子

\n\n

考虑文档中的示例:

\n\n
>>> p._fields            # view the field names\n(\'x\', \'y\')\n\n>>> Color = namedtuple(\'Color\', \'red green blue\')\n>>> Pixel = namedtuple(\'Pixel\', Point._fields + Color._fields)\n>>> Pixel(11, 22, 128, 255, 0)\nPixel(x=11, y=22, red=128, green=255, blue=0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何从 \xe2\x80\x9cPixel\xe2\x80\x9d 实例推断出 \xe2\x80\x9cColor\xe2\x80\x9d 或 \xe2\x80\x9cPoint\xe2\x80\x9d 实例?

\n\n

最好是具有蟒蛇精神。 …

python dto namedtuple python-2.7 python-attrs

3
推荐指数
1
解决办法
1159
查看次数