我正在调试一些代码,我想知道何时访问特定的字典.好吧,它实际上是一个子类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,和我熟悉的实现屈德宁在其他 语言.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) 我希望我的字典不区分大小写.
我有这个示例代码:
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()]但我不知道如何最好地将它集成到我现有的代码中.(如果这是一个合理,简单的方法,无论如何).
什么之间的区别UserDict,dict并ABC和建议哪一种?文档似乎已经弃用了UserDict?
似乎UserDict update()会使用我的setitem方法,而dict不是?在我想要自定义setitem和getitem功能的情况下,哪些方法是非常重要的?
使用ABCs我必须实现绝对所有方法,因为它没有提供默认实现?
我想做一dict件事做两件事:
intern() 所有键和值所以其中UserDict,dict并ABC能最好地让我做到这一点?
使用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) 给出一对一的词典(=双射)生成à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)管理这个反向字典并提供第二个查找功能的?或者这样的结构(或类似结构)是否已经存在?
我尝试使用抽象基类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 中使用带有抽象基类的多重继承。似乎应该是可能的,但无法以一种或另一种方式找到声明。
基本的 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)
这也不会失败。我怎样才能要求“孩子”来实现“你好”?
我想知道是否有办法"链接"一个类的两个属性或给同一个属性赋予两个名称?
例如,我实际上正在编写一个脚本,该脚本根据用户提供的数据创建三角形.我的三角形是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中使用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?