相关疑难解决方法(0)

如何在多个模块中使用python日志记录

我想知道在Python应用程序中执行日志记录的标准设置是什么.

我正在使用Logging类,并且我编写了自己的logger类来实例化Logging类.我的主要然后实例化我的记录器包装类.但是,我的main实例化其他类,我希望其他类也能够通过main中的logger对象写入日志文件.

如何使该logger对象可以被其他类调用?这几乎就像我们需要某种静态记录器对象来实现它.

我想问题的长短之处在于:如何在代码结构中实现日志记录,以便从main中实例化的所有类都可以写入同一个日志文件?我是否只需要在指向同一文件的每个类中创建一个新的日志记录对象?

python logging

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

在namedtuple类上自定义排序

经常使用namedtuple类.我一直在想今天是否有一种很好的方法来为这样的类实现自定义排序,即使默认排序键不是namedtuple的第一个元素(然后是第二个,第三个等).

我的第一直觉是实现__lt____eq__total_ordering剩下的工作完成(它填写了le,ne,gt,ge):

from collections import namedtuple
from functools import total_ordering


@total_ordering
class B(namedtuple('B', 'x y')):
    def __lt__(self, other):
        return self.y < other.y
Run Code Online (Sandbox Code Playgroud)

然而:

def test_sortingB():
    b1 = B(1, 2)
    b2 = B(2, 1)
    assert b2 < b1  # passes
    assert b2 <= b1  # fails
Run Code Online (Sandbox Code Playgroud)

哦,对...... 如果缺少total_ordering其他方法,则只填写其他方法.由于tuple/namedtuple有这样的方法,total_ordering对我没有任何作用.

所以我想我的选择是

  1. 停止使用namedtuple并构建我自己的无聊类,继续使用total_ordering
  2. 继续使用namedtuple并实现所有6种比较方法
  3. 继续使用namedtuple并插入排序值作为第一个字段.幸运的是,我没有太多的课程实例,但通常我只是依靠字段的顺序来初始化它们,这可能是令人讨厌的.也许这是一个坏习惯.

关于解决这个问题的最佳方法的建议?

python sorting namedtuple functools

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

在mixin中初始化实例变量

我想使用mixin为类提供一些功能.该功能使用一些额外的每对象状态.我想知道什么是最简洁的初始化本地状态的方法.考虑这个例子:

class Mixin:
    items = []
    def append(self, x):
        self.items.append(x)
    def display(self):
        print self.items

class Foo(object, Mixin): pass
class Bar(object, Mixin): pass

foo = Foo()
foo.append('foo')
foo.display()

>>> ['foo']

bar = Bar()
bar.append('bar')
bar.display()

>>> ['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

这里,状态是items列表.在Mixin体中初始化它显然是错误的.通常情况下,我会把它初始化__init__,但是对于Mixin,我不想搞砸__init__.

我可以做以下事情:

class Mixin:
    items = None

def append(self, x):
    if self.items is None:
        self.items = []
    self.items.append(x)
Run Code Online (Sandbox Code Playgroud)

但是每种情况append都要对这个条件进行评估,它似乎并不是最干净的解决方案.

任何替代品?或者也许添加__init__到mixin是方式?

(如果使用mixins是否可以,这是一个单独的问题)

相关:

python

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

Python:将函数作为参数传递来初始化对象的方法。Pythonic 与否?

我想知道是否有一种可接受的方法将函数作为参数传递给对象(即在init块中定义该对象的方法)。

更具体地说,如果函数依赖于对象参数,我们将如何做到这一点。

将函数传递给对象似乎足够Pythonic,函数就像其他东西一样是对象:

def foo(a,b):
    return a*b

class FooBar(object):
    def __init__(self, func):
        self.func = func

foobar = FooBar(foo)
foobar.func(5,6)

# 30
Run Code Online (Sandbox Code Playgroud)

这样就可以了,一旦引入对对象其他属性的依赖,问题就会出现。

def foo1(self, b):
    return self.a*b

class FooBar1(object):
    def __init__(self, func, a):
        self.a=a
        self.func=func

# Now, if you try the following:
foobar1 = FooBar1(foo1,4)
foobar1.func(3)
# You'll get the following error:
# TypeError: foo0() missing 1 required positional argument: 'b'
Run Code Online (Sandbox Code Playgroud)

这可能简单地违反了 python 中 OOP 的一些神圣原则,在这种情况下,我只需要做其他事情,但它似乎也可能被证明是有用的。

我想出了几种可能的方法来解决这个问题,我想知道哪种(如果有的话)被认为是最可接受的。

解决方案1

foobar1.func(foobar1,3)

# 12
# seems ugly
Run Code Online (Sandbox Code Playgroud)

解决方案2

class FooBar2(object):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python oop

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

如何创建一个django模型字段mixin

我正在尝试为模型字段(而不是表单字段)创建通用mixin,mixin的init采用命名参数.我遇到麻烦用另一个类实例化mixin.

这是代码

class MyMixin(object):
    def __init__(self, new_arg=None, *args, **kwargs):
        super(MyMixin, self).__init__(*args, **kwargs)
        print self.__class__, new_arg


class MyMixinCharField(MyMixin, models.CharField):
    pass

...

class MyMixinModelTest(models.Model):
    myfield = MyMixinCharField(max_length=512,new_arg="myarg")
Run Code Online (Sandbox Code Playgroud)

对此模型进行迁移会产生以下输出:

<class 'myapp.mixintest.fields.MyMixinCharField'> myarg 
<class 'myapp.mixintest.fields.MyMixinCharField'> None 
<class 'myapp.mixintest.fields.MyMixinCharField'> None 
Migrations for 'mixintest':   
   0001_initial.py:
        - Create model MyMixinModelTest
Run Code Online (Sandbox Code Playgroud)

首先,为什么init运行3次?在第二个两个中,kwarg'new_arg'在哪里?如何为django创建字段mixin?

编辑:与另一个问题相反,这个问题询问混合,相关问题是指模型混合.

python django

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

如何在django中对类视图进行身份验证

在Django文档中,他们说这个https://docs.djangoproject.com/en/dev/topics/auth/default/#user-objects

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
Run Code Online (Sandbox Code Playgroud)

但是我如何在基于类的视图上使用login_required

@login_required
classMyCreateView(CreateView):
Run Code Online (Sandbox Code Playgroud)

这给出了错误

'function' object has no attribute 'as_view'

python django

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

Mixin 是基于策略的设计的特例吗?

据我所知,mixin是先写派生类,然后通过模板参数注入基类。

示例:http : //www.drdobbs.com/cpp/mixin-based-programming-in-c/184404445

据我所知,基于策略的设计也是如此。 http://en.wikipedia.org/wiki/Policy-based_design

它并没有说你应该从它派生,你也可以以其他方式使用模板参数。然而,例如在维基百科基于策略的设计示例是这样的:

template<typename Base>
class Derive: private Base
Run Code Online (Sandbox Code Playgroud)

我认为这与 mixin 相同。(相反,在 mixin 中你通常使用公共继承)

它们之间有什么显着区别还是mixin是基于策略的设计的特例?

c++ design-patterns template-mixins policy-based-design

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

子类化TestCase时,如何防止Django在父类上运行单元测试?

背景:我正在研究一个网络抓取工具,以跟踪在线商店的价格。它使用Django。我为每个商店都有一个模块,每个模块都具有get_price()get_product_name()编写的功能,因此主刮板模块可以互换使用这些模块。我有store_a.py,store_b.py,store_c.py等,每个都定义了这些功能。

为了防止重复代码,我制作了StoreTestCase,它继承自TestCase。对于每个商店,我都有一个StoreTestCase的子类,例如StoreATestCase和StoreBTestCase。

当我手动测试StoreATestCase 类时,测试运行器执行我想要的操作。它使用子类中的数据self.data进行测试,而不尝试自行建立和测试父类:

python manage.py test myproject.tests.test_store_a.StoreATest
Run Code Online (Sandbox Code Playgroud)

但是,当我手动测试模块时,例如:

python manage.py test myproject.tests.test_store_a
Run Code Online (Sandbox Code Playgroud)

它首先为子类运行测试并成功,但是随后为父类运行测试并返回以下错误:

    for page in self.data:
TypeError: 'NoneType' object is not iterable
Run Code Online (Sandbox Code Playgroud)

store_test.py(父类)

from django.test import TestCase

class StoreTestCase(TestCase):

    def setUp(self):
        '''This should never execute but it does when I test test_store_a'''
        self.data = None
    def test_get_price(self):
        for page in self.data:
            self.assertEqual(store_a.get_price(page['url']), page['expected_price'])
Run Code Online (Sandbox Code Playgroud)

test_store_a.py(子类)

import store_a
from store_test import StoreTestCase

class StoreATestCase(StoreTestCase):

    def setUp(self):
        self.data = …
Run Code Online (Sandbox Code Playgroud)

python django unit-testing

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

拖放小部件tkinter

我正在尝试制作一个Python程序,您可以在其中移动小部件.

这是我的代码:

import tkinter as tk 
main = tk.Tk()
notesFrame = tk.Frame(main, bd = 4, bg = "a6a6a6")
notesFrame.place(x=10,y=10)
notes = tk.Text(notesFrame)
notes.pack()
notesFrame.bind("<B1-Motion>", lambda event: notesFrame.place(x = event.x, y = event.y)
Run Code Online (Sandbox Code Playgroud)

但是,这会出现超级故障并且小部件来回跳跃.

谢谢!

python tkinter

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

记录所有django模型中的所有保存/更新/删除操作

我的django应用程序中有几种型号.其中一些来自models.Model,some - 来自django-hvad的可翻译模型.我想记录它们上的每个保存/删除/更新操作.我知道管理员操作的标准django记录器,但它们太简短且不冗长以满足我的需求.

一般来说,实现此目的的一种常见方法是使用这些操作定义超类并从中扩展每个模型.这不是我的情况,因为我的一些模型是可翻译的,有些则不是.

第二种方式是方面/装饰器.我想,python/django必须有类似的东西,但我不知道到底是什么:)

请为我提供最合适的登录方式.谢谢!

django django-models python-3.x

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