我想知道在Python应用程序中执行日志记录的标准设置是什么.
我正在使用Logging类,并且我编写了自己的logger类来实例化Logging类.我的主要然后实例化我的记录器包装类.但是,我的main实例化其他类,我希望其他类也能够通过main中的logger对象写入日志文件.
如何使该logger对象可以被其他类调用?这几乎就像我们需要某种静态记录器对象来实现它.
我想问题的长短之处在于:如何在代码结构中实现日志记录,以便从main中实例化的所有类都可以写入同一个日志文件?我是否只需要在指向同一文件的每个类中创建一个新的日志记录对象?
我经常使用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对我没有任何作用.
所以我想我的选择是
关于解决这个问题的最佳方法的建议?
我想使用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是否可以,这是一个单独的问题)
相关:
我想知道是否有一种可接受的方法将函数作为参数传递给对象(即在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 的一些神圣原则,在这种情况下,我只需要做其他事情,但它似乎也可能被证明是有用的。
我想出了几种可能的方法来解决这个问题,我想知道哪种(如果有的话)被认为是最可接受的。
foobar1.func(foobar1,3)
# 12
# seems ugly
Run Code Online (Sandbox Code Playgroud)
class FooBar2(object):
def __init__(self, …Run Code Online (Sandbox Code Playgroud) 我正在尝试为模型字段(而不是表单字段)创建通用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?
编辑:与另一个问题相反,这个问题询问场混合,相关问题是指模型混合.
在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'
据我所知,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是基于策略的设计的特例?
背景:我正在研究一个网络抓取工具,以跟踪在线商店的价格。它使用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程序,您可以在其中移动小部件.
这是我的代码:
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)
但是,这会出现超级故障并且小部件来回跳跃.
谢谢!
我的django应用程序中有几种型号.其中一些来自models.Model,some - 来自django-hvad的可翻译模型.我想记录它们上的每个保存/删除/更新操作.我知道管理员操作的标准django记录器,但它们太简短且不冗长以满足我的需求.
一般来说,实现此目的的一种常见方法是使用这些操作定义超类并从中扩展每个模型.这不是我的情况,因为我的一些模型是可翻译的,有些则不是.
第二种方式是方面/装饰器.我想,python/django必须有类似的东西,但我不知道到底是什么:)
请为我提供最合适的登录方式.谢谢!
python ×8
django ×4
c++ ×1
functools ×1
logging ×1
namedtuple ×1
oop ×1
python-3.x ×1
sorting ×1
tkinter ×1
unit-testing ×1