- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚开始使用 python 的 attrs
模块,它非常灵活(或者类似地,我们可以使用 Python 3.7 DataClasses)。我的一个常见使用模式是让类成为参数值的容器。我喜欢分配参数时的标签,以及更简洁的属性样式引用值,但我也喜欢有一些在将值存储在有序字典中时非常有用的功能:
*
像 tuple
或 list
一样解包以输入函数参数**
在需要或需要关键字传递时解包。我可以通过向类中添加三个方法来实现这一切
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
def keys(self):
return 'A', 'alpha', 'c', 'k', 'M_s'
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return (getattr(self, x) for x in self.keys())
然后我可以像这样使用这些类:
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *params, 300)
result2 = function2(x=1, y=2, **params)
这里的动机是数据类提供了方便和清晰。但是,有一些原因导致我不要求我正在编写的模块使用数据类。函数调用最好接受简单的参数,而不是复杂的数据类。
上面的代码很好,但我想知道我是否遗漏了一些可以让我完全跳过编写函数的东西,因为模式非常清晰。属性按照我希望它们解包的顺序添加,并且可以根据关键字参数的属性名称读取为键值对。
也许这是这样的:
@addtupleanddictunpacking
@attr.s
class DataParameters:
A: float = attr.ib()
alpha: float = attr.ib()
c: float = attr.ib()
k: float = attr.ib()
M_s: float = attr.ib()
但我不确定 attrs
本身是否有我没有找到的东西可以做到这一点。此外,我不确定如何在添加属性时保持属性的顺序并将其转换为键方法。
最佳答案
它没有直接集成到类中,而是the asdict
和 astuple
辅助函数旨在执行此类转换。
params = DataParameters(1, 2, 3, 4, 5)
result1 = function1(100, 200, *attr.astuple(params), 300)
result2 = function2(x=1, y=2, **attr.asdict(params))
它们没有集成到类本身中,因为这会使类表现得像一个序列或映射无处不在,当 TypeError
/AttributeError
是预期的。在性能方面,这应该没问题;无论如何,解包都会转换为 tuple
/dict
(它不能传递不是 tuple
或 dict
的东西> 直接输入,因为 C API 期望能够在其参数上使用特定于类型的 API。
如果您真的希望该类充当序列或映射,您基本上必须执行您已经完成的操作,尽管您可以使用辅助函数来减少自定义代码和重复的变量名,例如:
@classmethod
def keys(cls):
return attr.fields_dict(cls).keys()
def __getitem__(self, key):
return getattr(self, key)
def __iter__(self):
return iter(attr.astuple(self, recurse=False))
关于python - 如何使用 tuple 和 dict 解包但没有额外的方法来制作 attrs 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52079816/
我有一个包含文件名 和文件路径 的元组列表。我想找到重复的 filename(但 filepath 可能不同),即文件名相同但 filepath 可能不同的元组。 元组列表示例: file_info
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
我有一个包含几个字段的自定义结构,我想在快速 switch 语句中对其进行模式匹配,这样我就可以通过将其中一个字段与另一个字段进行比较来自定义匹配正则表达式。 例如鉴于这种结构: struct MyS
我有一种动态元组结构: template //Should only be tuples class DynamicTuple { vector data; //All data is st
这个问题在这里已经有了答案: What and When to use Tuple? [duplicate] (5 个答案) 关闭 8 年前。 我正在查看 Tuple 的在线示例,但我没有看到任何理
在我的项目中我有很多坐标要处理,在二维情况下我发现(cons x y)的构造比(list x y)快和 (vector x y)。 但是,我不知道如何将 cons 扩展到 3D 或更进一步,因为我没有
我有以下 Scala 代码: def f(x: Int, y: Int): Option[String] = x*y match { case 0 => None case n =>
我的直觉告诉我,在一般情况下,只有宏或复杂类型的体操才能解决这个问题。 Shapeless 或 Scalaz 可以在这里帮助我吗?这是 N=2 问题的具体实例,但我正在寻找的解决方案适用于所有合理的
为什么这段 Scala 代码是这样的: class Test { def foo: (Int, String) = { (123, "123") } def bar: Unit
我是 python 和 pygame 的新手,我正在尝试学习向量和类的基础知识,但在这个过程中我搞砸了,而且我在理解和修复标题中的错误消息方面苦苦挣扎。 这是我的 Vector 类的代码: impor
我正在编写一个程序来打开和读取一个 txt 文件,并在每一行中循环。将第 2 列和第 4 列中的值相乘并将其分配给第 5 列。 A 500.00 A 84.15 ? B 648.80 B 77.61
我知道还有其他几个问题提出了完全相同的问题,但是当我运行时: 导入命令 从 pyDes 导入 * def encrypt(data, password,): k = des(password,
我有一个元组列表,内容如下: >>>myList [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', '
给定一个 boost::tuple 和 std::tuple,你如何在它们之间进行转换? 也就是说,您将如何实现以下两个功能? template boost::tuple asBoostTuple(
我无法初始化 std::tuple来自 std::tuple 的逐元素元素兼容类型。为什么它不像 boost::tuple 那样工作? #include #include template st
我是 Storm 的新手并且我正在尝试找出如何编写一个 bolt 测试来测试子类 BaseRichBolt 中的 execute(Tuple tuple) 方法。 问题是 Tuple 似乎是不可变的,
如果我有如下元组列表: [('a', 'b'), ('c', 'd'), ('a', 'b'), ('b', 'a')] 我想删除重复的元组(在内容和内部项目顺序方面重复)以便输出为: [('a',
我编写了一个简单的脚本来模拟基于每用户平均收入 (ARPU)、利润率和客户保持客户的年数 (ltvYears) 的客户生命周期值(value) (LTV)。下面是我的脚本。它在“ltvYears =
以下是我的代码,它是一组元组:。输出:设置([(‘A’,20160129,36.44),(‘A’,20160104,41.06),(‘A’,20160201,37.37)])。如何将另一个元组(‘A’
我用以下代码编写了一个程序: import pandas as pd import numpy as np from typing import Tuple def split_data(self,
我是一名优秀的程序员,十分优秀!