我在python中使用ConfigObj进行模板式插值.通过**展开我的配置字典似乎不进行插值.这是一个功能还是一个bug?有什么好的解决方法吗?
$ cat my.conf
foo = /test
bar = $foo/directory
>>> import configobj
>>> config = configobj.ConfigObj('my.conf', interpolation='Template')
>>> config['bar']
'/test/directory'
>>> '{bar}'.format(**config)
'$foo/directory'
Run Code Online (Sandbox Code Playgroud)
我希望第二行是/test/directory.为什么插值不能用**kwargs?
有可能做这样的事情:
r = {range(0, 100): 'foo', range(100, 200): 'bar'}
print r[42]
> 'foo'
Run Code Online (Sandbox Code Playgroud)
所以我想使用数值范围作为字典索引的一部分.为了使事情变得更复杂,我还想使用多索引('a', range(0,100)).所以这个概念应该理想地扩展到那个.有什么建议?
这里也提出了类似的问题,但我对全面实施感兴趣,而不是该问题的不同方法.
我需要创建一个扩展dict的类,然后遇到一个有趣的问题,如下图所示.
为什么d.update()忽略班级__getitem__?
编辑:这是在python2.7,它似乎不包含collections.UserDict思考UserDict.UserDict相当于我试过这个,它越来越接近,但仍然有趣的行为.
以下是我们可以从pandas 地图函数文档中读到的内容:
当 arg 是字典时,Series 中不在字典中的值(作为键)将转换为 NaN。但是,如果字典是定义missing的dict子类(即提供默认值的方法),则使用此默认值而不是NaN
所以我尝试用以下代码应用此注释:
import pandas as pd
class Missing_dict(dict) :
def __init__(self,*arg,**kw):
super(Missing_dict, self).__init__(*arg, **kw)
def __missing__(self, key) :
return key
md = Missing_dict({"a" : 0})
df = pd.DataFrame([{"key" : "a", "value" : 0}, {"key" : "b", "value" : 1}])
print (df)
print (df["key"].map(md))
Run Code Online (Sandbox Code Playgroud)
但结果不是我所期望的,在我的情况下,我想映射一列中的数据,如果在字典中找不到某个值,那么我希望这个值作为结果(换句话说,我想要如果键在字典中则为值,否则为键)。
我哪里错了?
我希望下面的类被内置类SpreadSheet视为子类,但是当我尝试这样注册它时,会抛出异常(也如下所示)。dictisinstance()AttributeError
做这样的事情的方法是什么?
\n注意:我的问题类似于是否可以成为内置类型的虚拟子类?,但其接受的答案并未解决所提出的名义问题(因此请不要投票将其作为重复项关闭)。
\n这样做的主要动机是允许将类的实例传递给json.dump()Python 并像 Python 一样对待dict。这是必需的,因为 \xe2\x80\x94 出于我不理解 \xe2\x80\x94 的原因,该类JSONEncoder使用, isinstance(value, dict)而不是isinstance(value, Mapping)。
from collections.abc import MutableMapping\n\n\nclass SpreadSheet(MutableMapping):\n def __init__(self, tools=None, **kwargs):\n self._cells = {}\n self._tools = {\'__builtins__\': None}\n if tools is not None:\n self._tools.update(tools) # Add caller supplied functions.\n\n def clear(self):\n return self._cells.clear()\n\n def __contains__(self, k):\n return k in self._cells\n\n def __setitem__(self, key, formula):\n self._cells[key] = formula\n\n …Run Code Online (Sandbox Code Playgroud) 我正在处理加载到 Python 字典中的 JSON 数据。其中很多都有可选字段,其中可能包含字典之类的东西。
dictionary1 =
{"required": {"value1": "one", "value2": "two"},
"optional": {"value1": "one"}}
dictionary2 =
{"required": {"value1": "one", "value2": "two"}}
Run Code Online (Sandbox Code Playgroud)
如果我这样做,
dictionary1.get("required").get("value1")
Run Code Online (Sandbox Code Playgroud)
显然,这是有效的,因为场"required"总是存在的。
但是,当我使用同一行dictionary2(以获取可选字段)时,这将产生一个AttributeError
dictionary2.get("optional").get("value1")
AttributeError: 'NoneType' object has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为第一个.get()将返回None,而第二个.get()不能调用.get()None 对象。
我可以通过提供默认值来解决这个问题,以防可选字段丢失,但是数据变得越复杂,这就会很烦人,所以我称之为“天真的修复”:
dictionary2.get("optional", {}).get("value1", " ")
Run Code Online (Sandbox Code Playgroud)
因此,第一个.get()将返回一个空字典{},可以在其上调用第二个字典.get(),并且由于它显然不包含任何内容,因此它将返回空字符串,如第二个默认值所定义的那样。
这将不再产生错误,但我想知道是否有更好的解决方案 - 特别是对于更复杂的情况(value1包含数组或另一个字典等......)
我也可以用 try - except 来解决这个问题AttributeError,但这也不是我喜欢的方式。
try:
value1 = dictionary2.get("optional").get("value1")
except AttributeError:
value1 …Run Code Online (Sandbox Code Playgroud) 我有一个 python 字典,它不时添加信息。
状况:
例子:
result = {}
def add_key(key, val):
test = result.get(key) # Test to see if key already exists
if test is None:
if len(result.keys()) < 3:
result[key] = val # This key and pair need to be deleted from the dictionary after
# 24 hours
else:
# Need code to remove the earliest added key.
add_key('10', 'object 2')
## Need another code logic to delete the key-value pair after 24 hours …Run Code Online (Sandbox Code Playgroud) 我想创建一个类来像字典一样解压它的对象。
例如,使用字典,您可以这样做
foo = {
"a" : 1
"b" : 2
}
def bar(a,b):
return a + b
bar(**foo)
Run Code Online (Sandbox Code Playgroud)
输出3
我希望能够做到这一点
class FooClass:
def __init__(self):
self.a = a
self.b = b
f = FooClass()
bar(**f)
Run Code Online (Sandbox Code Playgroud)
并让它输出3
这是我能找到的最相关的问题,但它没有解决这个问题,所以我认为这可能是不可能的。
目前我的解决方案是这样的:
class FooClass:
def __init__(self):
self.a = a
self.b = b
def to_dict(self):
return {
"a" : self.a,
"b" : self.b
}
Run Code Online (Sandbox Code Playgroud)
f = FooClass()
bar(**f.to_dict())
Run Code Online (Sandbox Code Playgroud) 我想创建一个自定义集,它将自动将对象转换为另一种形式,以便在集合中存储(请参阅使用Python字典作为非嵌套键)作为背景.
如果我重写add,remove,__contains__,__str__,update,__iter__,那将是足以使其他操作的行为正确,或者我需要重写什么吗?
python ×9
dictionary ×4
python-3.x ×2
configobj ×1
datetime ×1
json ×1
kwargs ×1
metaclass ×1
pandas ×1
python-2.7 ×1
set ×1
subclass ×1