相关疑难解决方法(0)

如何正确地子类化dict并覆盖__getitem__&__setitem__

我正在调试一些代码,我想知道何时访问特定的字典.好吧,它实际上是一个子类dict并实现了一些额外功能的类.无论如何,我想做的是dict自己子类化并添加覆盖__getitem____setitem__产生一些调试输出.现在,我有

class DictWatch(dict):
    def __init__(self, *args):
        dict.__init__(self, args)

    def __getitem__(self, key):
        val = dict.__getitem__(self, key)
        log.info("GET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val)))
        return val

    def __setitem__(self, key, val):
        log.info("SET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val)))
        dict.__setitem__(self, key, val)
Run Code Online (Sandbox Code Playgroud)

' name_label'是一个最终将设置的键,我想用它来识别输出.然后我改变了我正在修改的类DictWatch而不是dict更改了对超级构造函数的调用.但是,似乎没有任何事情发生.我以为我很聪明,但我想知道我是否应该走另一个方向.

谢谢您的帮助!

python dictionary

75
推荐指数
5
解决办法
8万
查看次数

Python中是否有"多图"实现?

我是新来的Python,和我熟悉的实现屈德宁其他 语言.Python是否内置了这样的数据结构,或者在常用的库中可用?

为了说明"multimap"的含义:

a = multidict()
a[1] = 'a'
a[1] = 'b'
a[2] = 'c'

print(a[1])  # prints: ['a', 'b']
print(a[2])  # prints: ['c']
Run Code Online (Sandbox Code Playgroud)

python dictionary

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

不区分大小写的字典

我希望我的字典不区分大小写.

我有这个示例代码:

text = "practice changing the color"

words = {'color': 'colour',
        'practice': 'practise'}

def replace(words,text):

    keys = words.keys()

    for i in keys:
        text= text.replace(i ,words[i])
    return  text

text = replace(words,text)

print text
Run Code Online (Sandbox Code Playgroud)

输出=练习改变颜色

我想要另一个字符串,"practice changing the Color"(Color以一个大写字母开头)也给出相同的输出.

我相信有一种通用的方法可以转换为小写, mydictionary[key.lower()]但我不知道如何最好地将它集成到我现有的代码中.(如果这是一个合理,简单的方法,无论如何).

python

64
推荐指数
6
解决办法
5万
查看次数

子类dict:UserDict,dict还是ABC?

什么之间的区别UserDict,dictABC和建议哪一种?文档似乎已经弃用了UserDict

似乎UserDict update()会使用我的setitem方法,而dict不是?在我想要自定义setitemgetitem功能的情况下,哪些方法是非常重要的?

使用ABCs我必须实现绝对所有方法,因为它没有提供默认实现?

我想做一dict件事做两件事:

  • intern() 所有键和值
  • 将一些值存储在SQLite数据库中

所以其中UserDict,dictABC能最好地让我做到这一点?

python subclass

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

Python中UserDict类的优点

使用UserDict类有什么好处?

我的意思是,如果不是,我真的得到了什么

class MyClass(object):
    def __init__(self):
        self.a = 0
        self.b = 0
...
m = MyClass()
m.a = 5
m.b = 7
Run Code Online (Sandbox Code Playgroud)

我会写以下内容:

class MyClass(UserDict):
    def __init__(self):
        UserDict.__init__(self)
        self["a"] = 0
        self["b"] = 0
...
m = MyClass()
m["a"] = 5
m["b"] = 7
Run Code Online (Sandbox Code Playgroud)

编辑:如果我理解正确,我可以在两种情况下都在运行时向对象添加新字段?

m.c = "Cool"
Run Code Online (Sandbox Code Playgroud)

m["c"] = "Cool"
Run Code Online (Sandbox Code Playgroud)

python oop

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

是否有更好的方法来存储双向字典而不是存储它的反向分离?

给出一对一的词典(=双射)生成àla

for key, value in someGenerator:
     myDict[key] = value
Run Code Online (Sandbox Code Playgroud)

可以通过添加来简单地创建反向查找字典

    invDict[value] = key
Run Code Online (Sandbox Code Playgroud)

for循环.但这是一种Pythonic方式吗?我是否应该编写另外一个class Bijection(dict)管理这个反向字典并提供第二个查找功能的?或者这样的结构(或类似结构)是否已经存在?

python dictionary

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

如何在Python中使用Abstract Base Classes实现dict?

我尝试使用抽象基类MutableMapping在Python中实现映射,但是我在实例化时遇到了错误.我将如何dict使用抽象基类创建这个字典的工作版本,以尽可能多的方式模拟内置

>>> class D(collections.MutableMapping):
...     pass
... 
>>> d = D()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class D with abstract methods __delitem__, __getitem__, __iter__, __len__, __setitem__
Run Code Online (Sandbox Code Playgroud)

一个好的答案将演示如何使这项工作,特别是没有子类化dict(我非常熟悉的概念).

python dictionary abc

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

python ABC &amp; 多重继承

我想知道是否可以在 python 中使用带有抽象基类的多重继承。似乎应该是可能的,但无法以一种或另一种方式找到声明。

基本的 ABC 示例:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

由于“hello”未在“Child”中实现,这将失败。

我想知道如何将 ABC 与多重继承结合起来。我想让“BaseABC”或“Child”也从其他一些单独的类继承。明确:


from abc import ABC, abstractmethod


class BaseABC(ABC, dict):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

这不会像第一种情况那样以预期的方式失败。还:


from abc import ABC, abstractmethod


class BaseABC(ABC):

    @abstractmethod
    def hello(self):
        pass


class Child(BaseABC, dict):
    pass


child = Child()

Run Code Online (Sandbox Code Playgroud)

这也不会失败。我怎样才能要求“孩子”来实现“你好”?

python multiple-inheritance abc

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

同名属性的2个名称

我想知道是否有办法"链接"一个类的两个属性或给同一个属性赋予两个名称?

例如,我实际上正在编写一个脚本,该脚本根据用户提供的数据创建三角形.我的三角形是ABC.这个三角形的边是AB,BC和CA. 所以三角形有这3个属性(self.AB,self.BC,self.CA).但AB = BA所以我想允许用户print myInstance.BA代替print myInstance.AB.

所以我想创建属性self.AB和属性BA(返回self.AB).当我尝试做print myInstance.BA而不是print myInstance.AB但我很贪心时工作正常...

我也想让用户做myInstance.BA = 5而不是myInstance.AB = 5在做这个时也编辑属性AB.

有办法做到这一点吗?

python

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

为什么**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
查看次数