小编sat*_*oru的帖子

如何实现持久的Python`list`?

我试图让一个对象像内置一样list,除了它的值在修改后保存.

我提出的实现是list在一个PersistentList类中包装.对于可能更改列表的方法的每次访问,包装器委托给包装list,并在调用后将其保存到键值数据库.

码:

class PersistentList(object):
    def __init__(self, key):
        self.key = key 
        self._list = db.get(key, []) 

    def __getattr__(self, name):
        attr = getattr(self._list, name)
        if attr:
            if attr in ('append', 'extend', 'insert', 'pop',
                'remove', 'reverse', 'sort'):
                attr = self._autosave(attr)
            return attr
        raise AttributeError

    def _autosave(self, func):
        @wraps(func)
        def _(*args, **kwargs):
            ret = func(*args, **kwargs)
            self._save()
            return ret 
        return _

    def _save(self):
        db.set(self.key, self._list)
Run Code Online (Sandbox Code Playgroud)

这个实现有几个问题:

  1. 我必须像append每次访问时一样修饰方法,有没有更好的方法来装饰某些对象的多个方法?

  2. l += [1,2,3]我没有实现iadd方法那样的操作不起作用. …

python

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

如何在python中读取/ dev/random

我读了一本/dev/random类似于无限文件的书,但是当我设置以下代码来查看内容的样子时,它什么都不打印.

with open("/dev/random") as f:
    for i in xrange(10):
        print f.readline()
Run Code Online (Sandbox Code Playgroud)

顺便说一下,当我尝试这个时/dev/urandom,它起作用了.

python unix

8
推荐指数
3
解决办法
7188
查看次数

将属性重命名为_property的原因

我正在阅读collections.py昨天的源代码.

namedtuple函数中,template生成一个字符串,然后exec在临时命名空间中编辑.

在命名空间dict中,property重命名为to _propertytupleto _tuple.

我想知道这背后的原因是什么.这个重命名有什么问题有助于避免?

python coding-style

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

使用pip时如何避免重建现有车轮?

有了pip 1.5.X,我们可以使用pip wheel来构建和缓存封装的车轮,然后使用--use-wheel具有pip install从缓存的车轮安装.

我正在尝试在环境设置脚本中使用此功能.这就是我正在尝试的:

pip wheel --wheel-dir=/tmp Cython==0.19.2
pip install Cython==0.19.2 --use-wheel --no-index --find-links=/tmp
Run Code Online (Sandbox Code Playgroud)

我希望pip wheel在构建它之前检查轮子是否已经存在.但它似乎忽略了现有的轮子并且每次都建立.

有可能避免这种情况吗?

python pip python-wheel

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

为什么(numpy.nan,1)==(numpy.nan,1)?

虽然numpy.nan不等于numpy.nan,但(float('nan'), 1)不等于float('nan', 1),

(numpy.nan, 1) == (numpy.nan, 1)
Run Code Online (Sandbox Code Playgroud)

可能是什么原因?Python首先检查id是否相同?如果在比较元组的项目时首先检查身份,那么为什么不直接比较对象时检查它?

python

8
推荐指数
2
解决办法
258
查看次数

正确加入两个双链表的方法

在Linux内核源代码中,list_splice实现了__list_splice:

static inline void __list_splice(const struct list_head *list,
                                 struct list_head *prev,
                                 struct list_head *next)
{
        struct list_head *first = list->next; // Why?
        struct list_head *last = list->prev;

        first->prev = prev;
        prev->next = first;

        last->next = next;
        next->prev = last;
}
Run Code Online (Sandbox Code Playgroud)

是不是list已经指向链表的头部了?为什么我们需要list->next取而代之?

c linked-list linux-kernel

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

过度使用mixin是邪恶的,有哪些替代解决方案?

有时使用具有多重继承的mixin可以帮助我们提高代码的可重用性.

例如,以下设计

class FollowableMixin(object):
    def get_followers(self):
        ...
    ...

class User(FollowableMixin):
    ...
Run Code Online (Sandbox Code Playgroud)

可以更好地重用,而不是简单地添加get_followersUser:

class User(object):
    def get_followers(self):
        ...
    ...
Run Code Online (Sandbox Code Playgroud)

因为稍后我们可能会考虑支持其他潜在客户的可跟随实体get_followers:

class BookStore(FollowableMixin):
    ...
Run Code Online (Sandbox Code Playgroud)

但是,如果过度使用此模式,代码可能会变得过于复杂.

class User(FollowableMixin, RunnableMixin, FlyableMixin, WhatMixin ...):
    ...
Run Code Online (Sandbox Code Playgroud)

所有这些mixin类为您的类注入属性和方法,理解您的代码变得非常困难.例如,您不知道您调用的方法来自何处,并且此方法可能反过来包括在另一个mixin中调用方法...

我该怎么做才能简化这个程序?

python oop design-patterns

7
推荐指数
4
解决办法
1892
查看次数

7
推荐指数
2
解决办法
1411
查看次数

psutil.Process.get_memory_info中RSS的单位是什么?

当我使用时ps -o pid,rss -p 1,我看到以下内容:

PID RSS
  1 784
Run Code Online (Sandbox Code Playgroud)

但是当我查询rsspsutil,我得到一个不同的值:

>>> p = psutil.Process(1)
>>> print p.get_memory_info().rss
802816
Run Code Online (Sandbox Code Playgroud)

是否有可能psutil使用不同的单位?我在文档中找不到任何相关信息.

python process

7
推荐指数
2
解决办法
6050
查看次数

如果和和两个加数的按位XOR都是负数,这意味着什么?

例如,有长型的3个变量,我们添加ab并获得s:

long a, b, s;
...
s = a + b
Run Code Online (Sandbox Code Playgroud)

现在((s^a) < 0 && (s^b) < 0)意味着什么?

我在Python 的源代码中看到了这样的支票:

    if (PyInt_CheckExact(v) && PyInt_CheckExact(w)) {
        /* INLINE: int + int */
        register long a, b, i;
        a = PyInt_AS_LONG(v);
        b = PyInt_AS_LONG(w);
        i = a + b;
        if ((i^a) < 0 && (i^b) < 0)
            goto slow_iadd;
        x = PyInt_FromLong(i);
    }
Run Code Online (Sandbox Code Playgroud)

c binary

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