GVKun编程网logo

如何在Python中正确实现映射协议?(python的映射)

25

对于如何在Python中正确实现映射协议?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python的映射,并且为您提供关于python通过什么实现映射、RedisPython-如何在py

对于如何在Python中正确实现映射协议?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解python的映射,并且为您提供关于python通过什么实现映射、Redis Python-如何在python中根据特定模式删除所有键,而无需python迭代、在Python中正确使用互斥锁、在Python中正确导入模块的宝贵知识。

本文目录一览:

如何在Python中正确实现映射协议?(python的映射)

如何在Python中正确实现映射协议?(python的映射)

我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别用作全局对象(在rt.new_context(global)中)是否实现了映射协议。(这基本上是传递给python-
spidermonkey的字典,因此javascript对python变量的访问受到限制。)

我无法在Python中找到映射协议的正式定义,因此我一直在尝试和尝试确定其中的内容。有官方参考吗?

答案1

小编典典

collections.abc模块定义了象接口MappingSequence等。

通过从该模块中的抽象基类继承,您可以获得某些方法的默认实现。因此,要被视为a Mapping,您的类定义应如下所示:

class MyMapping(collections.abc.Mapping):    def __getitem__(self, item)    def __iter__(self)    def __len__(self)

继承自Mapping会为您提供大部分dict有用方法的“免费”实现:

  • __contains__
  • keys
  • items
  • values
  • get
  • __eq__
  • __ne__

如果这些默认方法实现对自定义数据结构的效率不高,则始终可以使用自己的版本覆盖它们。


被认为是MutableMapping,您的类的界面应如下所示:

class MyMutableMapping(collections.abc.MutableMapping):    def __getitem__(self, key)    def __setitem__(self, key, item)    def __delitem__(self, key)    def __iter__(self)    def __len__(self)

继承自MutableMapping会为您免费提供所有Mapping方法的定义,以及:

  • pop
  • popitem
  • clear
  • update
  • setdefault

如果您要从头开始“滚动自己的脚本”,并且不想使用抽象基类,那么如果希望您的类可以严格地用Liskov替代,则应该尝试定义 所有 上述方法dict

python通过什么实现映射

python通过什么实现映射

字典dict是python中重要的数据结构,在字典中,每一个键都对应一个值,其中键与值的关系就叫做映射,也可以说是每一个键都映射到一个值上。

python通过什么实现映射

映射(map)是更具一般性的数据类型,具体到Python中就是字典。(推荐学习:Python视频教程)

在使用字典的同时我们一定会有一个疑问,它是怎样通过键去映射到值的呢,它怎么知道这个键的值是谁?

于是我们有了一个这样的想法:

立即学习“Python免费学习笔记(深入)”;

使用列表来存储一项一项的键值对象,寻找的时候就遍历一遍列表,找到当键是你所要找的键时,取出该对象中的值value。

这个想法很简单,我们可以很快的实现一下:

这里先介绍一些相关的抽象基类,Mapping与MutableMapping,它们在collections模块中,供我们实现自定义的map类。Mapping包含dict中的所有不变方法,MutableMapping扩展包含了所有可变方法,但它们两个都不包含那五大核心特殊方法:getitem、setitem、delitem、len、iter。也就是说我们的目标就是实现这五大核心方法使该数据结构能够使用。

from collections import MutableMapping

class MyMap(MutableMapping):

    class item():

        def __init__(self,key,value):
            self.key = key
            self.value = value

        def __eq__(self, other):
            return self.key == other.key

        def __ne__(self, other):
            return self.key != other.key

    def __init__(self):
        self.table = []

    def __getitem__(self, item):
        for i in self.table:
            if i.key == item:
                return i.value
        raise KeyError(''Key Error: ''+ repr(item))

    def __setitem__(self, key, value):
        for i in self.table:
            if i.key == key:
                i.value = value
                return
        self.table.append(self.item(key,value))

    def __delitem__(self, key):
        for n,i in enumerate(self.table):
            if i.key == key:
                self.pop(n)
                return
        raise KeyError(''Key Error: ''+ repr(key))

    def __len__(self):
        return len(self.table)

    def __iter__(self):
        for i in self.table:
            yield i.key
登录后复制

上面这个办法很简单,但是却不是很有效率,我们每次都需要遍历一遍列表才能找到该键的索引,所以时间复杂的为O(n)。

更多Python相关技术文章,请访问Python教程栏目进行学习!

以上就是python通过什么实现映射的详细内容,更多请关注php中文网其它相关文章!

Redis Python-如何在python中根据特定模式删除所有键,而无需python迭代

Redis Python-如何在python中根据特定模式删除所有键,而无需python迭代

我正在编写django管理命令来处理一些我们的Redis缓存。基本上,我需要选择所有确认为特定模式的键(例如:“ prefix:*”)并删除它们。

我知道我可以使用cli来做到这一点:

redis-cli KEYS "prefix:*" | xargs redis-cli DEL

但是我需要在应用程序中执行此操作。所以我需要使用python绑定(我正在使用py-redis)。我尝试将列表送入Delete中,但是失败了:

from common.redis_client import get_redis_client
cache = get_redis_client()
x = cache.keys('prefix:*')

x == ['prefix:key1','prefix:key2'] # True

# 现在

cache.delete(x)

#返回0。什么都没有删除

我知道我可以遍历x:

for key in x:
   cache.delete(key)

但这将失去redis出色的速度并滥用其功能。是否有带py-redis的pythonic解决方案,没有迭代和/或cli?

谢谢!

在Python中正确使用互斥锁

在Python中正确使用互斥锁

我从python中的多线程开始(或者至少我的脚本有可能创建多个线程)。该算法是否是Mutex的正确用法?我尚未测试此代码,它可能甚至无法正常工作。我只希望processData在一个线程中运行(一次一个),而主while循环保持运行,即使队列中有一个线程也是如此。

from threading import Thread
from win32event import CreateMutex
mutex = CreateMutex(None,False,"My Crazy Mutex")
while(1)
    t = Thread(target=self.processData,args=(some_data,))
    t.start()
    mutex.lock()

def processData(self,data)
    while(1)
        if mutex.test() == False:
            do some stuff
            break

编辑:重新阅读我的代码,我可以看到它是完全错误的。但是,这就是为什么我在这里寻求帮助。

在Python中正确导入模块

在Python中正确导入模块

如何设置模块导入,以便每个模块都可以访问其他所有模块的对象?

我有一个中等大小的Python应用程序,在各个子目录中都有模块文件。我使用创建了将这些子目录附加到sys.path模块并导入一组模块的模块importthisModule as tm。使用该限定条件引用模块对象。然后,我使用将该模块导入其他模块from moduleImports import*。现在的代码草率,其中有几处通常是重复的。

首先,应用程序失败,因为未分配某些模块引用。单元测试时,会运行相同的代码。

其次,我担心递归模块导入会引起问题。导入moduleImports导入thisModule,后者导入moduleImports。。。。

什么是正确的方法?

答案1

小编典典

“我有一个中等大小的Python应用程序,在各个子目录中都有模块文件。”

好。绝对确保每个目录都包含一个__init__.py文件,以便将其打包。

“我创建了将这些子目录附加到sys.path”的模块

坏。使用PYTHONPATH或安装整个结构Lib/site-packages。不要sys.path动态更新。这是一件坏事。难以管理和维护。

“使用导入一组模块import thisModule as tm。”

没道理 也许您import thisModule as tm的结构中的每个模块都有一个。这是典型的标准做法:仅导入您需要的模块,而不导入其他模块。

“然后,我使用from moduleImports import *”将该模块导入其他模块

坏。不要毯子导入一堆随机的东西。

每个模块都应详细列出其所需的具体内容。

import thisimport thatimport package.module

显式列表。没魔术 没有动态变化sys.path

我当前的项目有100多个模块,一打左右的软件包。每个模块都会导入所需的内容。没魔术

关于如何在Python中正确实现映射协议?python的映射的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于python通过什么实现映射、Redis Python-如何在python中根据特定模式删除所有键,而无需python迭代、在Python中正确使用互斥锁、在Python中正确导入模块的相关知识,请在本站寻找。

本文标签: