小编VPf*_*PfB的帖子

字典成员资格检查的意外行为

不可读的对象不能插入到dict中.据记载,这是有充分理由的.

但是,我不明白为什么它会影响成员资格测试:

if value not in somedict:
    print("not present")
Run Code Online (Sandbox Code Playgroud)

我假设会员资格测试只能返回TrueFalse.但是当value它不可避免时,就会失败TypeError: unhashable type.我想说True应该是这个not in测试的正确答案,因为value它显然没有包含在内,somedict并且完全不相关它无法插入.

另一个例子:

try:
    result = somedict[value]
except KeyError:
    # handle the missing key
Run Code Online (Sandbox Code Playgroud)

当值不可用时,它会失败,TypeError: unhashable type我希望KeyError相反.

也:

somedict.get(value, default)
Run Code Online (Sandbox Code Playgroud)

不返回默认值,但抛出TypeError.


那么为什么unhashable in somedict不评估False和返回正确或错误的正确测试是什么?


更新:

object.__contains__(self, item)

被称为实施会员测试运营商.如果item在self中,则返回true,否则返回false.

(摘自"数据模型 - Python文档")


附录:

这是用户界面程序的简化部分,当其中一个参数是dict时失败.

# args = list of function arguments created from user's …
Run Code Online (Sandbox Code Playgroud)

python dictionary

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

寻找一种有效的方式来存储历史数据

数据是一个 Python 字典,表示随时间缓慢变化的某种状态。值经常更改,通常一次更改一两个项目。键也可以改变,但这是一个罕见的事件。每次更改后,都会记住新数据集以备将来检查。

结果是一个带有增加时间戳的长序列。“b”打开和关闭再打开的一个非常简单的例子:

(timestamp1, {'a':False, 'b':False, 'c':False}),
(timestamp2, {'a':False, 'b':True, 'c':False}),
(timestamp3, {'a':False, 'b':False, 'c':False}), 
(timestamp4, {'a':False, 'b':True, 'c':False}),
Run Code Online (Sandbox Code Playgroud)

这个序列使用起来非常方便,但显然效率很低。几乎相同的数据被一遍又一遍地复制。真正的 dict 大约有 100 项。这就是为什么我正在寻找一种不同的方式来将数据历史存储在内存和磁盘上。

我很确定这个问题在过去已经解决过很多次了。这个问题有什么标准/推荐的方法吗?解决方案不一定是完美的。足够好就足够了。


这就是我会做的,除非某个善良的灵魂显示出更好的方法。仅存储增量更改可节省空间:

(timestamp1, FULL, {'a':False, 'b':False, 'c':False}),
(timestamp2, INCREMENTAL, {'b':True}),
(timestamp3, INCREMENTAL, {'b':False}),
(timestamp4, INCREMENTAL, {'b':True}),
Run Code Online (Sandbox Code Playgroud)

然而,数据并不容易访问,因为它必须从最后的 FULL 状态分几个步骤恢复。为了限制缺点,每个第 N 条记录将存储为 FULL,所有其他记录为 INCREMENTAL。

我可能会添加这个小改进:添加对已记录的相同状态的引用以防止重复:

(timestamp1, FULL, {'a':False, 'b':False, 'c':False}),
(timestamp2, INCREMENTAL, {'b':True}),
(timestamp3, SAME_AS, timestamp1),
(timestamp4, SAME_AS, timestamp2),
Run Code Online (Sandbox Code Playgroud)

python storage

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

如何忽略functools中的参数。lru_cache?

这是我要通过缓存增强的功能的框架,因为执行RPC(远程过程调用)涉及到其他主机的TCP连接。

def rpc(rpc_server, rpc_func, arg):
    return rpc_server.do_rpc(rpc_func, arg)
Run Code Online (Sandbox Code Playgroud)

但是,最简单的装饰方式是:

@functools.lru_cache()
Run Code Online (Sandbox Code Playgroud)

不能很好地工作,因为rpc_server对象来来去去,因此缓存应该忽略此参数。

我可以自己编写一个简单的记忆代码。没问题。实际上,我没有其他解决方案。

我无法在这样的方式来改写这个功能@lru_cache()装饰可以应用 rpc_server会作为参数传递(即我不想做rpc_server一个全局变量)。可能吗?

python-3.x

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

从一个目录中读取许多小文件有多大问题?

我必须阅读许多(最多5 mio.)小(9 KB)文件.目前,他们都在一个目录中.我担心这会花费二次时间甚至n ^ 2 log n来查找,这是对的吗?这是否重要(查找是否需要比实际读数更多的时间)?操作系统缓存文件时,运行时间的渐近行为是否存在差异?

我使用C++ - 流来读取文件.目前我正在使用带有NTFS的Windows 7,但我稍后会在linux集群上运行该程序(不确定是哪个文件系统).

c++ linux windows

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

如何测试类似字节的对象?

哪个测试可以判断对象是否是类似字节的对象

通常,字符串或类似字节的对象可以出现在某些函数调用中.在这种情况下,一个简单但间接的解决方案就是if not isinstance(obj, str).

我发现 字节串collections.abc.它似乎给出了正确的答案,但我不确定这是否是正确的方法:

>>> import collections.abc as cabc
>>> isinstance(bytes(),cabc.ByteString)
True
>>> isinstance(bytearray(),cabc.ByteString)
True
>>> isinstance("string",cabc.ByteString)
False
Run Code Online (Sandbox Code Playgroud)

python

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

如何在 SQLAlchemy 中加载 SQLite3 扩展?

我构建了一个 SQLite 扩展(即 .so 库),我想使用 SQLAlchemy 在我的应用程序中使用它。这是一个 Flask 应用程序,但我认为 Flask 在这里不起作用。

该扩展可以从 CLI 加载并且似乎可以工作:

$ sqlite3

SQLite version 3.20.1 2017-08-24 16:21:36
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .load ./libSqliteIcu.so
Run Code Online (Sandbox Code Playgroud)

但我需要在我的应用程序中做到这一点。Python 文档中有一个示例:

import sqlite3

con = sqlite3.connect(":memory:")

# enable extension loading
con.enable_load_extension(True)

# Load the fulltext search extension
con.execute("select load_extension('./fts3.so')")
Run Code Online (Sandbox Code Playgroud)

但在我的应用程序中,我必须使用db以下方法访问数据库:

db = flask_sqlalchemy.SQLAlchemy()
Run Code Online (Sandbox Code Playgroud)

我可以将最后一条语句改写为:

db.session.execute('select load_extension("./libsqliteicu.so")')
Run Code Online (Sandbox Code Playgroud)

但它因“未授权”错误而失败。

如何呼叫enable_load_extension()或以其他方式成功加载分机?

python sqlite sqlalchemy flask-sqlalchemy

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

两次异步操作,一次超时

基本上我想要:

await action1()
await action2()
return result
Run Code Online (Sandbox Code Playgroud)

两个动作都有一个超时 - 这很重要 - 有一条错误消息告诉哪个动作超时了.

相比之下,只需一个动作:

try:
    await asyncio.wait_for(action(), timeout=1.0)
except asyncio.TimeoutError:
    raise RuntimeError("Problem")
Run Code Online (Sandbox Code Playgroud)

现在我有两个动作,我不喜欢它.

import asyncio

async def a2():
    try:
        await asyncio.sleep(1.0)
    except asyncio.CancelledError:
        raise RuntimeError("Problem 1") from None
    try:
        await asyncio.sleep(1.0)
    except asyncio.CancelledError:
        raise RuntimeError("Problem 2") from None
    return True


async def test():
    loop = asyncio.get_event_loop()
    action_task = loop.create_task(a2())
    # timeouts: 0.5 -> Problem1 exc; 1.5 -> Problem2 exc; 2.5 -> OK
    try:
        await asyncio.wait_for(action_task, timeout=0.5)
    except asyncio.TimeoutError:
        pass
    result = …
Run Code Online (Sandbox Code Playgroud)

python python-asyncio

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

如何取消转义系统名称?

Systemd 记录了以这种方式转义单元名称中的非字母数字字符的主要规则:

任何“/”字符都被“-”替换,所有其他不是 ASCII 字母数字或“_”的字符都被 C 风格的“\x2d”转义符替换。

还有一个不转义的例子:

$ systemd-escape -u 'Hall\xc3\xb6chen\x2c\x20Meister'
哈洛臣大师

此处此处的文档中的更多信息)

让我们忽略琐碎的替换"/"-> "-"。我正在尝试在 Python 中取消转义 systemd 名称(没有 3rd 方库)。我尝试过的许多解决方案都不起作用,他们将两个字节的 UTF-8 转换"ö"为两个字符。

最后这似乎产生了正确的答案:

>>> esc=r'Hall\xc3\xb6chen\x2c\x20Meister'
>>> esc.encode('latin-1').decode('unicode_escape').encode('latin-1').decode('utf-8')
'Hallöchen, Meister'
Run Code Online (Sandbox Code Playgroud)

如您所见:str -> bytes -> str -> bytes -> str。可以以某种方式简化吗?

python

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

“<nothing> not callable”mypy 错误的原因是什么?

9 个月后更新:版本 0.991 没有错误mypymypy该问题可能是同时已修复的问题。


您能解释一下为什么mypy抱怨这个演示程序的最后一行吗?我不明白出了什么问题。程序运行良好并打印出预期的输出。

from collections.abc import Iterable, Callable

class RevTuple(tuple):
    def __new__(cls, arg):
        return super().__new__(cls, reversed(arg))

data = [1,3,5]

func: Callable[[Iterable], tuple]

func = tuple
print(func(data))

func = RevTuple
print(func(data))   # mypy: error: <nothing> not callable
Run Code Online (Sandbox Code Playgroud)

python mypy

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

对于这种情况(子类方法),正确的类型是什么?

我无法正确获得以下类型提示。能否请你帮忙?

# example edited to make simpler (was async)
from typing import Any, Callable, ClassVar

class Base:
    def n_a(self) -> str:
        return 'N/A'

    meth1: ClassVar[Callable[[Base], str]] = n_a 
    # also meth2, meth3, ...

class Subclass(Base):
    def meth1(self) -> str:  # <-- line 11
        return 'yes'
Run Code Online (Sandbox Code Playgroud)

错误是:

test.py:11: error: Signature of "meth1" incompatible with supertype "Base"  [override]
test.py:11: note:      Superclass:
test.py:11: note:          def (Base, /) -> str
test.py:11: note:      Subclass:
test.py:11: note:          def meth1(self) -> str
Run Code Online (Sandbox Code Playgroud)

问题大概就在这里:

ClassVar[Callable[[Base], str]]
                  ^^^^^^
Run Code Online (Sandbox Code Playgroud)

因为这是没有错误地接受的: …

python python-typing

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