相关疑难解决方法(0)

如何在表单的clean()方法中访问请求对象或任何其他变量?

我试图request.user获取表单的clean方法,但是如何访问请求对象?我可以修改clean方法以允许变量输入吗?

python django

92
推荐指数
8
解决办法
6万
查看次数

如何在运行时动态更改实例的基类?

本文有一个片段__bases__,通过向类继承的类的现有类集合添加一个类来动态更改某些Python代码的继承层次结构.好的,这很难读,代码可能更清晰:

class Friendly:
    def hello(self):
        print 'Hello'

class Person: pass

p = Person()
Person.__bases__ = (Friendly,)
p.hello()  # prints "Hello"
Run Code Online (Sandbox Code Playgroud)

也就是说,Person不从Friendly源级别继承,而是通过修改__bases__Person类的属性在运行时动态添加此继承关系.但是,如果您更改FriendlyPerson成为新的样式类(通过继承自object),则会收到以下错误:

TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Run Code Online (Sandbox Code Playgroud)

关于这一点的谷歌搜索似乎表明,在运行时更改继承层次结构时,新样式类和旧样式类之间存在一些不兼容性.具体来说:"新式类对象不支持赋予其基础属性".

我的问题是,是否有可能通过使用__mro__属性使上述Friendly/Person示例在Python 2.7+中使用新式类工作?

免责声明:我完全意识到这是一个模糊的代码.我完全意识到,在实际的生产代码中,这样的技巧往往难以理解,这纯粹是一个思想实验,并且可以让人们了解Python如何处理与多重继承相关的问题.

python inheritance dynamic

68
推荐指数
3
解决办法
3万
查看次数

懒惰记录器消息字符串评估

我在我的python应用程序中使用标准的python日志记录模块:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("log")
while True:
  logger.debug('Stupid log message " + ' '.join([str(i) for i in range(20)]) )
  # Do something

问题是,虽然调试级别不启用,那个愚蠢的日志消息是在每次循环迭代,这严重损害了性能评估.

这有什么解决方案吗?

在C++中,我们有log4cxx一个提供这样的宏的包:
LOG4CXX_DEBUG(logger, messasage)
有效地评估为

if (log4cxx::debugEnabled(logger)) {
    log4cxx.log(logger,log4cxx::LOG4CXX_DEBUG, message)
}

但是由于Python(AFAIK)中没有宏,是否有一种有效的记录方法?

python logging

61
推荐指数
4
解决办法
2万
查看次数

理解Python中的元类和继承

关于元类,我有些困惑.

继承

class AttributeInitType(object):

   def __init__(self,**kwargs):
       for name, value in kwargs.items():
          setattr(self, name, value)

class Car(AttributeInitType):

    def __init__(self,**kwargs):
        super(Car, self).__init__(**kwargs)
    @property
    def description(self):
       return "%s %s %s %s" % (self.color, self.year, self.make, self.model)

c = Car(make='Toyota', model='Prius', year=2005, color='green')
print c.description
Run Code Online (Sandbox Code Playgroud)

与元类

class AttributeInitType(type):
   def __call__(self, *args, **kwargs):
       obj = type.__call__(self, *args)
       for name, value in kwargs.items():
           setattr(obj, name, value)
       return obj

class Car(object):
   __metaclass__ = AttributeInitType

   @property
   def description(self):
       return "%s %s %s %s" % (self.color, self.year, self.make, self.model) …
Run Code Online (Sandbox Code Playgroud)

python inheritance metaclass

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

PyDev unittesting:如何在"捕获的输出"中捕获记录到logging.Logger的文本

我正在使用PyDev进行Python应用程序的开发和单元测试.至于单元测试,一切都很好,除了没有内容记录到日志框架.PyDev的"捕获输出"未捕获记录器.

我已经将所有记录到标准输出的内容转发如下:

import sys
logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))
Run Code Online (Sandbox Code Playgroud)

然而,"捕获的输出"不会显示记录到记录器的东西.

这是一个示例unittest-script:test.py

import sys
import unittest
import logging

logger = logging.getLogger()
logger.level = logging.DEBUG
logger.addHandler(logging.StreamHandler(sys.stdout))

class TestCase(unittest.TestCase):
    def testSimpleMsg(self):
        print("AA")
        logging.getLogger().info("BB")
Run Code Online (Sandbox Code Playgroud)

控制台输出是:

Finding files... done.
Importing test modules ... done.

testSimpleMsg (itf.lowlevel.tests.hl7.TestCase) ... AA
2011-09-19 16:48:00,755 - root - INFO - BB
BB
ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Run Code Online (Sandbox Code Playgroud)

但是测试的CAPTURED OUTPUT是:

======================== CAPTURED OUTPUT =========================
AA
Run Code Online (Sandbox Code Playgroud)

有人知道如何捕获logging.Logger在执行此测试期间记录到的所有内容吗?

python logging unit-testing pydev

52
推荐指数
5
解决办法
4万
查看次数

有没有办法将__len__或__eq__等方法实现为classmethods?

__len__(self)在Python中实现方法非常容易,因此它可以处理这样的len(inst)调用:

class A(object):

  def __len__(self):
    return 7

a = A()
len(a) # gives us 7
Run Code Online (Sandbox Code Playgroud)

而且有很多相似的方法,你可以定义(__eq__,__str__,__repr__等).我知道Python类也是对象.

我的问题:我可以以某种方式定义,例如,__len__以便以下工作:

len(A) # makes sense and gives some predictable result
Run Code Online (Sandbox Code Playgroud)

python class

39
推荐指数
2
解决办法
3万
查看次数

Python动态继承:如何在实例创建时选择基类?

介绍

我在编程工作中遇到了一个有趣的案例,要求我在python中实现动态类继承机制.我在使用术语"动态继承"时的意思是一个特别是不从任何基类继承的类,而是选择在实例化时从几个基类之一继承,具体取决于某些参数.

因此,我的问题如下:在我将介绍的情况下,通过动态继承实现所需额外功能的最佳,最标准和"pythonic"方式是什么.

为了以简单的方式总结这个案例,我将举例说明使用两个代表两种不同图像格式的类:'jpg''png'图像.然后我将尝试添加支持第三种格式的功能:'gz'图像.我意识到我的问题并不那么简单,但我希望你已经准备好与我一起承担更多的问题了.

两个图像的例子情况

此脚本包含两个类:ImageJPGImagePNG,都继Image承自基类.要创建图像对象的实例,系统会要求用户image_factory使用文件路径作为唯一参数来调用该函数.

然后,此函数从路径中猜出文件格式(jpgpng),并返回相应类的实例.

两个具体的图像类(ImageJPGImagePNG)都能够通过其data属性解码文件.两者都以不同的方式做到这一点.但是,Image为了执行此操作,都要求基类提供文件对象.

UML图1

import os

#------------------------------------------------------------------------------#
def image_factory(path):
    '''Guesses the file format from the file extension
       and returns a corresponding image instance.'''
    format = os.path.splitext(path)[1][1:]
    if format == 'jpg': return ImageJPG(path)
    if format == 'png': return ImagePNG(path)
    else: raise Exception('The format "' + format + '" is not supported.') …
Run Code Online (Sandbox Code Playgroud)

python oop inheritance design-patterns

37
推荐指数
3
解决办法
2万
查看次数

向初学者解释python'self'变量

我几乎不知道OOP术语和概念.我从概念上知道对象是什么,对象有方法.我甚至明白在python中,类是对象!那很酷,我只是不知道它意味着什么.它没有点击我.

我目前正在尝试理解一些我认为将阐明我对python的理解的详细答案:

  1. "yield"关键字在Python中的作用是什么?
  2. 什么是Python中的元类?

在第一个答案中,作者使用以下代码作为示例:

>>> class Bank(): # let's create a bank, building ATMs
...    crisis = False
...    def create_atm(self) :
...        while not self.crisis :
...            yield "$100"
Run Code Online (Sandbox Code Playgroud)

我不会立即弄清楚self指向的是什么.这绝对是不理解类的一个症状,我将在某些时候开展工作.澄清,在

>>> def func():
...   for i in range(3):
...     print i
Run Code Online (Sandbox Code Playgroud)

我理解i指向列表中的项目range(3),因为它在函数中,不是全局的.但是什么self"指向"?

python oop scope class

33
推荐指数
5
解决办法
8万
查看次数

什么是Python元类有用?

对于不能以任何其他方式使用的元类,可以做些什么?

亚力理马尔泰利说,如果没有元类,这里有一些任务无法实现Python元类和类装饰器 我想知道哪些是?

python metaclass class decorator

30
推荐指数
4
解决办法
2823
查看次数

如何在Python中实现可订阅类(可订阅类,而不是可订阅对象)?

要实现可订阅对象很简单,只需__getitem__在此对象的类定义中实现即可.
但是现在我想实现一个可订阅的类.例如,我想实现此代码:

class Fruit(object):
    Apple = 0
    Pear = 1
    Banana = 2
    #________________________________ 
    #/ Some other definitions,         \
    #\ make class 'Fruit' subscriptable. /
    # -------------------------------- 
    #        \   ^__^
    #         \  (oo)\_______
    #            (__)\       )\/\
    #                ||----w |
    #                ||     ||

print Fruit['Apple'], Fruit['Banana']
#Output: 0 2
Run Code Online (Sandbox Code Playgroud)

我知道getattr可以做同样的事情,但我觉得下标访问更优雅.

python

24
推荐指数
4
解决办法
1万
查看次数