你知道是否有一个内置函数来从任意对象构建一个字典?我想做这样的事情:
>>> class Foo:
... bar = 'hello'
... baz = 'world'
...
>>> f = Foo()
>>> props(f)
{ 'bar' : 'hello', 'baz' : 'world' }
Run Code Online (Sandbox Code Playgroud)
注意:它不应包括方法.只有字段.
Python有一个名为的单例NotImplemented.
为什么有人想要返回NotImplemented而不是提出NotImplementedError异常?难道不会让它更难找到bug,例如执行无效方法的代码吗?
我希望能够创建一个类(在Python中),一旦初始化__init__,不接受新属性,但接受现有属性的修改.我可以看到有几种黑客方法可以做到这一点,例如有一个__setattr__方法,比如
def __setattr__(self, attribute, value):
if not attribute in self.__dict__:
print "Cannot set %s" % attribute
else:
self.__dict__[attribute] = value
Run Code Online (Sandbox Code Playgroud)
然后__dict__直接在里面编辑__init__,但我想知道是否有"正确"的方法来做到这一点?
是否有人能够testLookups()在此代码段中解释评论?
我运行代码,确实评论sais是真的.但是我想理解为什么它是真的,即为什么cPickle根据它的引用方式为同一个对象输出不同的值.
它与引用计数有什么关系吗?如果是这样,那不是某种错误 - 即腌制和反序列化的对象会有异常高的引用计数,实际上永远不会收集垃圾?
我正在腌制,压缩和保存python对象.我希望能够仔细检查我保存的对象是否是在解压缩和去除后返回的完全相同的对象.我认为我的代码中有一个错误,但当我将问题归结为一个可重现的例子时,我发现python并不认为在两个不同的时间点创建的两个看似相同的对象是相等的.这是一个可重复的例子:
class fubar(object):
pass
print(fubar() == fubar())
#False
Run Code Online (Sandbox Code Playgroud)
为什么python认为这两个对象不相等?检查两个对象确实相同的最pythonic方法是什么?
解释这一点的最简单方法:
import unittest
from element import Element
class TestHTMLGen(unittest.TestCase):
def test_Element(self):
page = Element("html", el_id=False)
self.assertEqual(page, Element("html", el_id=False)) # this is where I need help
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
AssertionError: <element.Element object at 0x025C1B70> != <element.Element object at 0x025C1CB0>
Run Code Online (Sandbox Code Playgroud)
我知道这些对象并不完全相同,但是有什么方法可以检查它们是否相等?我认为assertEqual 会起作用。
编辑:我正在使用 addTypeEqualityFunc。但是,我仍然遇到麻烦
def test_Element(self):
page = Element("html", el_id=False)
self.addTypeEqualityFunc(Element, self.are_elements_equal)
self.assertEqual(page, Element("html", el_id=False))
def are_elements_equal(self, first_element, second_element, msg=None):
print first_element.attribute == second_element.attribute
return type(first_element) is type(second_element) and first_element.tag == second_element.tag and first_element.attribute == second_element.attribute
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:False,它表示测试通过了。它不应通过,因为first_element.attribute 不等于second_element.attribute。此外,即使我只有return falsefor are_elements_equal,测试仍然通过。
给定两个PyObject*s,我如何在 C API 中比较它们?
我一开始想到a == b,但它显然是不正确的,因为它会比较指针而不是对象。我正在寻找a == b(不是a is b)Python C API 中的 Python 等价物。
这个问题不是上述问题的重复,我不是要求一种方法来比较实例,而是要求方法assertEqual,以及它的目的是什么.
assertEqual(a, b)检查是否a == b返回True或False,
文件说,
测试第一和第二是相等的.如果值不相等,则测试将失败.
我assertEqual在一个简单的课上运行三个测试,
上课时考试
class Car:
def __init__(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
TestCase
class CarTest(unittest.TestCase):
def test_diff_equal(self):
car1 = Car('Ford')
car2 = Car('Hyundai')
self.assertEqual(car1, car2)
def test_name_equal(self):
car1 = Car('Ford')
car2 = Car('Ford')
self.assertEqual(car1, car2)
def test_instance_equal(self):
car1 = Car('Ford')
self.assertEqual(car1, car1)
Run Code Online (Sandbox Code Playgroud)
结果是
F.F
======================================================================
FAIL: test_diff_equal (cartest.CarTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "cartest.py", line 10, in test_diff_equal
self.assertEqual(car1, car2)
AssertionError: <car.Car instance at …Run Code Online (Sandbox Code Playgroud) 我有一个MyClass类,它包含两个成员变量foo和bar.
我有这个类的两个实例,每个实例都有相同的foo和bar值.
但是,当我比较它们的相等性时,Python返回False.
如何确保这些对象相同,而不必在每次比较时手动检查其属性的值?例如,我希望能够使用"in"运算符.
我有一个像这样的链接和书签模型:
class Link(models.Model):
url = models.URLField(unique=True)
def __unicode__(self):
return self.url
class Bookmark(models.Model):
title=models.CharField(max_length=200)
user=models.ForeignKey(User)
link=models.ForeignKey(Link)
def __unicode__(self):
return u'%s, %s' % (self.user.username, self.link.url)
Run Code Online (Sandbox Code Playgroud)
现在,在视图中,我看到是否已存在具有给定URL的链接.然后,使用用户名将此对象传递给Bookmarks集合,以查看是否已存在具有此用户名的书签且链接实例已存在.
def bookmark_save_page(request):
if request.method == 'POST':
form = BookmarkSaveForm(request.POST)
if form.is_valid():
# Create or get Link
link, dummy = Link.objects.get_or_create(url=form.cleaned_data['url'])
# Create or get bookmark
bookmark, created = Bookmark.objects.get_or_create(user=request.user, link=link)
# Save bookmark to database
bookmark.save()
return HttpResponseRedirect('/user/%s/' % request.user.username)
Run Code Online (Sandbox Code Playgroud)
这是我不明白的一点.它如何知道如何将Link模型中的url字段作为比较方式?是因为我在Link模型中定义了这样的吗?
def __unicode__(self):
return self.url
Run Code Online (Sandbox Code Playgroud)
我来自.NET,你必须为类定义GetHash(),以指定实例应如何相互比较.
Python如何知道这一点?谢谢
假设我有一个类(Base)和一个列表(obj)
class Base:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Base({self.x}, {self.y})"
def area(self):
return self.x*self.y
obj = [Base(10, 12), Base(2, 5), Base(7, 8)]
Run Code Online (Sandbox Code Playgroud)
如何从 obj 列表中删除 Base(2, 5)?该obj.remove(Base(2,5))不起作用。有什么建议?
python ×11
class ×2
object ×2
unit-testing ×2
assert ×1
attributes ×1
c ×1
dictionary ×1
django ×1
equality ×1
exception ×1
logic ×1
oop ×1
pickle ×1
pydev ×1
python-3.x ×1
python-c-api ×1