相关疑难解决方法(0)

为什么**kwargs不用python ConfigObj进行插值?

我在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?

python kwargs configobj

7
推荐指数
1
解决办法
421
查看次数

在Python中使用范围作为字典索引

有可能做这样的事情:

r = {range(0, 100): 'foo', range(100, 200): 'bar'}

print r[42]

> 'foo'
Run Code Online (Sandbox Code Playgroud)

所以我想使用数值范围作为字典索引的一部分.为了使事情变得更复杂,我还想使用多索引('a', range(0,100)).所以这个概念应该理想地扩展到那个.有什么建议?

这里也提出了类似的问题,但我对全面实施感兴趣,而不是该问题的不同方法.

python dictionary

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

子类化词典; dict.update返回不正确的值 - python bug?

我需要创建一个扩展dict的类,然后遇到一个有趣的问题,如下图所示.

subclassing_dict_problem

为什么d.update()忽略班级__getitem__

编辑:这是在python2.7,它似乎不包含collections.UserDict思考UserDict.UserDict相当于我试过这个,它越来越接近,但仍然有趣的行为.

更新为使用UserDict

python dictionary python-2.7

5
推荐指数
1
解决办法
234
查看次数

使用 pandas 地图缺失数据

以下是我们可以从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)

但结果不是我所期望的,在我的情况下,我想映射一列中的数据,如果在字典中找不到某个值,那么我希望这个值作为结果(换句话说,我想要如果键在字典中则为值,否则为键)。

我哪里错了?

python pandas

5
推荐指数
0
解决办法
5247
查看次数

如何将 abc.MutableMapping 的实现注册为 dict 子类?

我希望下面的类被内置类SpreadSheet视为子类,但是当我尝试这样注册它时,会抛出异常(也如下所示)。dictisinstance()AttributeError

\n

做这样的事情的方法是什么?

\n

注意:我的问题类似于是否可以成为内置类型的虚拟子类?,但其接受的答案并未解决所提出的名义问题(因此请不要投票将其作为重复项关闭)。

\n

这样做的主要动机是允许将类的实例传递给json.dump()Python 并像 Python 一样对待dict。这是必需的,因为 \xe2\x80\x94 出于我不理解 \xe2\x80\x94 的原因,该类JSONEncoder使用 isinstance(value, dict)而不是isinstance(value, Mapping)

\n
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 metaclass subclass python-3.x

5
推荐指数
1
解决办法
2874
查看次数

处理可选的 python 字典字段

我正在处理加载到 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 json dictionary attributeerror

5
推荐指数
2
解决办法
2146
查看次数

暂时将键和值保留在字典中

我有一个 python 字典,它不时添加信息。

状况:

  1. 字典中的键始终不应超过 3 个。如果需要添加另一个键值对,则应删除此时字典中最早添加的键,并添加新的键值对。
  2. 添加键值后,1 天后应将其删除。

例子:

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)

python datetime dictionary

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

拆开一个类

我想创建一个类来像字典一样解压它的对象。

例如,使用字典,您可以这样做

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 argument-unpacking

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

覆盖Python中的set方法

我想创建一个自定义集,它将自动将对象转换为另一种形式,以便在集合中存储(请参阅使用Python字典作为非嵌套键)作为背景.

如果我重写add,remove,__contains__,__str__,update,__iter__,那将是足以使其他操作的行为正确,或者我需要重写什么吗?

python set python-3.x

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