有没有办法在Python中声明一个常量?在Java中,我们可以用这种方式创建常量值:
public static final String CONST_NAME = "Name";
Run Code Online (Sandbox Code Playgroud)
Python中上述Java常量声明的等价物是什么?
我有一个Python列表作为参数.如果我将参数的默认值设置为空列表,如下所示:
def func(items=[]):
print items
Run Code Online (Sandbox Code Playgroud)
Pylint会告诉我"危险的默认值[]作为参数".所以我想知道这里的最佳做法是什么?
我有一个类:
class A:
def __init__(self):
self.data = {}
Run Code Online (Sandbox Code Playgroud)
在某些时刻我想禁止self.data字段修改.
我已阅读PEP-416拒绝通知,有很多方法可以做到这一点.所以我想找到它们是什么.
我试过这个:
a = A()
a.data = types.MappingProxyType(a.data)
Run Code Online (Sandbox Code Playgroud)
这应该工作,但首先,它的python3.3 +和第二,当我这样做"禁止"多次我得到这个:
>>> a.data = types.MappingProxyType(a.data)
>>> a.data = types.MappingProxyType(a.data)
>>> a.data
mappingproxy(mappingproxy({}))
Run Code Online (Sandbox Code Playgroud)
虽然如果mappingproxy({})我要"禁止"很多次,那会好得多.检查isinstance(MappingProxyType)是一个选项,但我认为可以存在其他选项.
谢谢
我已经在Python中编程了一段时间,最近才开始在工作中使用Ruby.语言非常相似.但是,我刚刚遇到了一个Ruby功能,我不知道如何在Python中进行复制.这是Ruby的freeze方法.
irb(main):001:0> a = [1,2,3]
=> [1, 2, 3]
irb(main):002:0> a[1] = 'chicken'
=> "chicken"
irb(main):003:0> a.freeze
=> [1, "chicken", 3]
irb(main):004:0> a[1] = 'tuna'
TypeError: can't modify frozen array
from (irb):4:in `[]='
from (irb):4
Run Code Online (Sandbox Code Playgroud)
有没有办法在Python中模仿这个?
编辑:我意识到我觉得这只是为了列表; 在Ruby中,freeze是一个方法,Object所以你可以使任何对象不可变.我为这种困惑道歉.
在Python中,当你想使用列表作为某些字典的键时,你可以把它们变成元组,这些元组是不可变的,因此是可以删除的.
>>> a = {}
>>> a[tuple(list_1)] = some_value
>>> a[tuple(list_2)] = some_other_value
Run Code Online (Sandbox Code Playgroud)
当您想要将set对象用作某些字典的键时,也会发生同样的情况- 您可以构建一个冷冻集,这也是不可变的,因此是可清除的.
>>> a = {}
>>> a[frozenset(set_1)] = some_value
>>> a[frozenset(set_2)] = some_other_value
Run Code Online (Sandbox Code Playgroud)
但似乎对于字典没有等价物.
我想到的第一个想法(最终发现它很糟糕)是str(some_dict)用作关键.但是,字典总是使用不同的散列函数,因此相同字典的字符串可能不同.
是否有任何解决方法称为良好实践,或者是否有人有其他想法如何使用类字典对象作为其他词典的键?
简短版本:什么是覆盖dict.keys()和朋友的最佳方式,以防止我在Python 3中意外修改我的(据称)不可变字典?
在最近的一个问题中,我询问了如何在Python中散列不可变字典.从那时起,我已经建立了一个我不满意的不可改变,可以翻译的字典.但是,我意识到它有一个孔:在字典视图由归国keys(),items()和values()仍然让自己偶然突变我(据说)不变的字典.
关于字典视图的Stack Overflow唯一的问题是Python创建自己的字典子集dict视图,但这似乎与我的问题没什么关系,以及"冻结字典"的答案是什么?似乎没有进入压倒keys()等等
这样做会阻止我意外修改,例如,我的不可变字典的键吗?
class FrozenCounter(collections.Counter):
"Model an hashable multiset as an immutable dictionary."
# ...
def keys(self):
return list(super().keys())
def values(self):
return list(super().values())
def items(self):
return list(super().items())
Run Code Online (Sandbox Code Playgroud)
我主要看不懂.
dictviews无法修改dicts.在Python 3文档中,我误读了"它们提供了对字典条目的动态视图,这意味着当字典发生更改时,视图会反映这些更改","当视图发生更改时,字典会反映这些更改." 显然,这不是文件所说的.
是否有可能在创建后"冻结"python dict,以便无法为其添加新密钥?只能更改现有的键值.
如果没有,您如何知道何时更改现有的键值对,以及何时添加新的键值对?
我有可能包含其他字典或列表的嵌套字典。我需要能够比较这些字典的列表(或集合,真的)以表明它们是相等的。
列表的顺序不统一。通常,我会将列表转换为集合,但这是不可能的,因为有些值也是字典。
a = {'color': 'red'}
b = {'shape': 'triangle'}
c = {'children': [{'color': 'red'}, {'age': 8},]}
test_a = [a, b, c]
test_b = [b, c, a]
print(test_a == test_b) # False
print(set(test_a) == set(test_b)) # TypeError: unhashable type: 'dict'
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法来解决这个问题以显示test_a与test_b?
我想subclass dict在python中使子类的所有字典都是不可变的.
我不明白如何__hash__影响不变性,因为在我的理解中它只是表示对象的相等或不相等!
那么,可以__hash__用来实现不变性吗?怎么样 ?
更新:
目标是来自API的常见响应可用作dict,必须作为全局变量共享.那么,无论如何都需要完好无损?
我有一个按特定键排序的字典列表.每个字典包含32个元素,列表中有超过4000个字典.我需要代码来处理列表并返回一个删除了所有重复项的新列表.
这些链接的方法:
不要帮助我,因为字典是不可用的.
有什么想法吗?如果您需要更多信息,评论,我将添加信息.
编辑:
重复的字典可以是具有相同值的任何两个字典list[dictionary][key].
好的,这里是需要它的人的详细解释.
我有一个像这样的词典列表:
[ {
"ID" : "0001",
"Organization" : "SolarUSA",
"Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Timothy Black",
}, {
"ID" : "0002",
"Organization" : "SolarUSA",
"Matchcode" : "SolarUSA, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Johen Wilheim",
}, {
"ID" : "0003",
"Organization" : "Zapotec",
"Matchcode" : "Zapotec, Something Street, Somewhere State, Whatev Zip",
"Owner" : "Simeon Yurrigan",
} ]
Run Code Online (Sandbox Code Playgroud)
在此列表中,第一个和第二个字典是重复的,因为它们Matchcodes …
我想要一个Python对象,它可以灵活地接受任何键,并且我可以通过键访问,就像字典一样,但它是不可变的。一种选择可能是灵活地生成 anamedtuple但这样做是不好的做法吗?在下面的示例中,linter 不会期望nt具有属性a。
例子:
from collections import namedtuple
def foo(bar):
MyNamedTuple = namedtuple("MyNamedTuple", [k for k in bar.keys()])
d = {k: v for k, v in bar.items()}
return MyNamedTuple(**d)
>>> nt = foo({"a": 1, "b": 2})
Run Code Online (Sandbox Code Playgroud) 与之前的问题类似,我想创建一个冻结/不可变的字典。具体来说,初始化后,用户ValueError在尝试使用__delitem__和__setitem__方法时应该得到一个 。
与前面的问题不同,我特别希望它成为一个子类,其中初始化类型仅限于特定的键和值类型。
我自己尝试完成此任务collections.UserDict失败了:
class WorkflowParams(UserDict):
def __init__(self, __dict: Mapping[str, str]) -> None:
super().__init__(__dict=__dict)
def __setitem__(self, key: str, item: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
def __delitem__(self, key: str) -> None:
raise AttributeError("WorkflowParams is immutable.")
Run Code Online (Sandbox Code Playgroud)
当尝试使用它时:
workflow_parameters = WorkflowParams(
{
"s3-bucket": "my-big-bucket",
"input-val": "1",
}
)
Run Code Online (Sandbox Code Playgroud)
它失败了
Traceback (most recent call last):
File "examples/python_step/python_step.py", line 38, in <module>
workflow_parameters = WorkflowParams(
File "/home/sean/git/scargo/scargo/core.py", line 14, in __init__ …Run Code Online (Sandbox Code Playgroud) python ×12
dictionary ×6
immutability ×5
python-3.x ×3
list ×2
class ×1
collections ×1
constants ×1
duplicates ×1
freeze ×1
keyvaluepair ×1
namedtuple ×1
pylint ×1
python-2.7 ×1
ruby ×1
subclass ×1