小编Fin*_*inn的帖子

如何在新样式类中拦截对python"魔法"方法的调用?

我试图在新的样式类中拦截对python的双下划线魔术方法的调用.这是一个简单的例子,但它显示了意图:

class ShowMeList(object):
    def __init__(self, it):
        self._data = list(it)

    def __getattr__(self, name):
        attr = object.__getattribute__(self._data, name)
        if callable(attr):
            def wrapper(*a, **kw):
                print "before the call"
                result = attr(*a, **kw)
                print "after the call"
                return result
            return wrapper
        return attr
Run Code Online (Sandbox Code Playgroud)

如果我在列表周围使用该代理对象,我会获得非魔术方法的预期行为,但我的包装函数永远不会被魔术方法调用.

>>> l = ShowMeList(range(8))

>>> l #call to __repr__
<__main__.ShowMeList object at 0x9640eac>

>>> l.append(9)
before the call
after the call

>> len(l._data)
9
Run Code Online (Sandbox Code Playgroud)

如果我不从对象继承(第一行class ShowMeList:),一切都按预期工作:

>>> l = ShowMeList(range(8))

>>> l #call to __repr__
before the call …
Run Code Online (Sandbox Code Playgroud)

python python-3.x

32
推荐指数
2
解决办法
5901
查看次数

为什么python描述符__get__方法接受所有者类作为arg?

为什么python描述符中的__get__方法接受所有者类作为它的第三个参数?你能给出一个使用它的例子吗?

第一个参数(self)是不言而喻的,第二个(instances)在通常显示的描述符模式的上下文中是有意义的(如下所示),但我从未真正看到owner使用过的第三个().有人可以解释用例是什么吗?

仅仅通过参考和促进答案,这是我见过的描述符的典型用法:

class Container(object):
    class ExampleDescriptor(object):
        def __get__(self, instance, owner):
            return instance._name 
        def __set__(self, instance, value):
            instance._name = value
    managed_attr = ExampleDescriptor()
Run Code Online (Sandbox Code Playgroud)

鉴于instance.__class__可用,我能想到的是显式传递类与直接从类而不是实例(ex Container.managed_attr)访问描述符有关.即便如此,我还不清楚__get__在这种情况下会做些什么.

python

15
推荐指数
1
解决办法
1249
查看次数

php的memory_limit,upload_max_filesize和post_max_filesize之间的关系

底线:
我是否需要关注设置post_max_filesize>> memory_limit

详细信息:
这个答案表明上传的文件不需要适合php的memory_limit.在PHP的文档表明,整个后应该PHP的内存限制内适应.

我发现文档令人惊讶,我希望有人可以详细说明.例如,采取以下PHP配置:

; config A
memory_limit = 50M
upload_max_filesize = 100M
post_max_filesize = 1000M
max_file_uploads = 10    
Run Code Online (Sandbox Code Playgroud)

; config B
memory_limit = 50M
upload_max_filesize = 10M
post_max_filesize = 1000M
max_file_uploads = 100    
Run Code Online (Sandbox Code Playgroud)

通过这些配置,我希望能够:

  • 将10x100mb文件上传到服务器A,
  • 和100x10mb文件服务器.
我也希望如此:
  • 使用上传到服务器A的10个文件中的任何一个都是一个问题(50M包中的100M文件......).
  • 使用上传到服务器B的100个文件中的任何一个都可以(10 <50).
在尝试较少但又等效相关的数字时,我发现这些期望是正确的.

这种经历会让我说"通常memory_limit应该大于upload_max_filesize"; 相反,php 文档说:

一般来说,memory_limit应该大于post_max_size.

如果不是,为什么会发生什么?

当我的PHP代码被执行时,我看不到所有发布的文件都在内存中的证据.在我看来,我所拥有的只是一个$ _FILES路径,这些路径只能在磁盘上找到文件.在我能够反省环境之前,php是否会在内存中保留整个帖子?我需要关注设置post_max_filesize>> memory_limit吗?

除此之外:
违反手册的规则不会导致严重损坏的服务器(w/php5.3 apache2.2 …

php apache configuration file-upload

14
推荐指数
1
解决办法
7019
查看次数

PostgreSQL如何强制执行UNIQUE约束/它使用什么类型的索引?

在阅读关于索引唯一性文档作为实现细节后,我一直在尝试理清Postgres中唯一和索引之间的关系:

向表中添加唯一约束的首选方法是ALTER TABLE ... ADD CONSTRAINT.使用索引来强制执行唯一约束可以被视为不应直接访问的实现细节.但是,应该知道没有必要在唯一列上手动创建索引; 这样做只会复制自动创建的索引.

因此,按照他们的说法,我只是将事物声明为唯一并使用隐式索引 - 或 - 创建索引而不是假设值是唯一的.这是一个错误吗? 

我将从独特中获得什么样的指数?假设只有一个btree会接受唯一约束而且unique会隐式创建一个索引,那么UNIQUE是否真的创建了一个btree索引?我不想无意中在哈希索引上运行范围. 

postgresql indexing database-design unique-index unique-constraint

11
推荐指数
1
解决办法
4080
查看次数

Python:在初始评估后向类中添加父类

一般Python问题

我正在使用以下类结构导入Python库(称为animals.py):

class Animal(object): pass

class Rat(Animal): pass

class Bat(Animal): pass

class Cat(Animal): pass

...
Run Code Online (Sandbox Code Playgroud)

我想一个父类(添加Pet)到每个品种类(的Rat,Bat,Cat,...); 但是,我无法更改我导入的库的实际来源,因此它必须是运行时更改.

以下似乎有效:

import animals

class Pet(object): pass

for klass in (animals.Rat, animals.Bat, animals.Cat, ...): 
    klass.__bases__ = (Pet,) + klass.__bases__
Run Code Online (Sandbox Code Playgroud)

这是将父类注入Python中的继承树而不修改要修改的类的源定义的最佳方法吗?

激励情节

我正试图将持久性移植到控制实验室设备的大型库中.弄乱它是不可能的.我想Persistent试试ZODB 吧.我不想编写mixin/facade包装器库,因为我正在处理需要更新的应用程序代码中的100多个类和大量导入.我只是通过攻击我的入口点来测试选项:如上所示设置数据库,修补(但是在动物模块上拉动物种类而不是显式列表)然后在我退出时关闭数据库.

Mea Culpa /要求

这是一个故意的一般性问题.我对注入父母的不同方法以及对这些方法的利弊的评论感兴趣.我同意这种运行时的诡计会让代码变得非常混乱.如果我选择ZODB,我会做一些明确的事情.现在,作为python的普通用户,我对一般情况感到好奇.

python oop inheritance monkeypatching

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

python描述符的状态在哪里?

背景

我试图通过阅读Lutz的学习Python的部分来解决Python的描述符,其中他说:"像属性一样,描述符旨在处理特定的属性......与属性不同,描述符有自己的状态......"

在本章中,他展示了托管属性实际隐藏在包含/包装对象上的示例,如:

def __set__(self, instance, value):
    instance._name = value.lower()
Run Code Online (Sandbox Code Playgroud)

我理解这些例子,它们似乎在关于该主题的写作中很常见.也就是说,他们对财产的好处对我来说并不明显,他们似乎没有达到上述报价所承诺的内部状态.

在本章的最后,他展示了一个更接近我所描绘的"拥有自己的状态"的例子,如:

def __set__(self, instance, value):
    self.name = value.lower()
Run Code Online (Sandbox Code Playgroud)

该示例运行但不执行我期望它执行的操作.由于示例有点长,我把它放在Pastebin上并添加了显示意外行为的最后一行(Bob的名字现在是Sue).这是一个较短的演示片段:

class Wrapper(object):
    class ExampleDescriptor(object):
        def __get__(self, instance, owner):
            print "get %s" % self.state
            return self.state

        def __set__(self, instance, value):
            print "set %s" % value
            self.state = value
    ex = ExampleDescriptor()


w1 = Wrapper()
w1.ex = 1
print w1.ex
w2 = Wrapper()
print w2.ex
w2.ex = 2
print  w1.ex …
Run Code Online (Sandbox Code Playgroud)

python

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

为什么ePub文件比同一本书的mobi或PDF文件小得多

当我购买电子书时,我会下载所有可用的格式.我注意到各种格式的文件大小可能明显不同,而epub通常要小得多.

例如:

  • PDF - 5.7mb;
  • ePub - 2.7mb;
  • Mobi - 8.1mb.

要么:

  • PDF - 4.5mb;
  • ePub - 1.8mb;
  • Mobi - 530mb.

我翻过它们并试图确认内容是相同的,它们似乎是(即没有丢失大图像).任何人都可以解释为什么epub比其他两个小得多?

pdf kindle epub

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

Python 相对导入在包内而不是在路径上

如何将 python 包中的父目录(不在路径上)中的文件导入到子目录中的文件中?

我不太清楚 python 打包的词汇,所以举个例子:

dir1/
    __init__.py
    runner.py
    in_dir1.py
    dir2/
        __init__.py
        in_dir2.py
Run Code Online (Sandbox Code Playgroud)

dir1/in_dir1.py:

def example():
    print "Hello from dir1/in_dir1.example()"
Run Code Online (Sandbox Code Playgroud)

dir1/dir2/in_dir2.py

import in_dir1   #or whatever this should be to make this work
print "Inside in_dir2.py, calling in_dir1.example()"
print in_dir1.example()
Run Code Online (Sandbox Code Playgroud)

鉴于它dir1不在 python 路径上,我正在寻找导入in_dir1in_dir2.

我尝试from .. import in_dir1from ..dir1 import in_dir1 基于此问答,但都不起作用。执行该意图的正确方法是什么?这个问答似乎包含了答案;但是,我不太确定该怎么做/如何使用PEP 366实际解决我的问题

两个__init__.py文件都是空的,我使用的是v2.6

我试图在不使用谷歌不断出现的任何路径黑客的情况下做到这一点。

python packaging pythonpath

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

在保持类型的同时从python获取数字作为输入的最佳方法是什么

我正在尝试从python获取一个数字作为CLI输入.有效输入应该是int或float,我需要维护类型.因此验证int并返回float不起作用.

这是我能够想到的最好的东西,并不是那么好.

def is_valid(n):
    try:
        if '.' in n: return float(n)
        return int(n)
    except ValueError:
        print "try again"

def num_input(s):
    n = raw_input(s)
    while is_valid(n) is None:
        n = raw_input(s)
    return is_valid(n)

valid_num = num_input("Enter a valid number: ")
Run Code Online (Sandbox Code Playgroud)

显然这不是最好的方法.

python shell input command-line-interface

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

对象可变性对python中的作用域有什么影响?

以下(荒谬但说明性的)代码通过改变封闭函数中定义的列表来按预期工作:

def outside1():
    l = list('abcd')
    def inside(a):
        print "Before - %i: %r" % (id(l), l)
        l.append(a)
        print "After - %i: %r\n" % (id(l), l)
    return inside

f = outside1()
[f(c) for c in 'efgh']
Run Code Online (Sandbox Code Playgroud)

此代码还可以显示在封闭范围内可以访问在封闭范围中定义的不可变:

def outside2():
    t = tuple('abcd')
    def inside():
        print "%i: %r" % (id(t), t)
    return inside

outside2()()
Run Code Online (Sandbox Code Playgroud)

然而,这失败了local variable 't' referenced before assignment:

def outside3():
    t = tuple('abcd')
    def inside(a):
        print "Before - %i: %r" % (id(t), t)
        t = t + (a,) …
Run Code Online (Sandbox Code Playgroud)

python closures scope

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