2001-08-11 00:21:35 -03:00
|
|
|
import unittest
|
2015-05-20 12:29:18 -03:00
|
|
|
import pickle
|
|
|
|
import sys
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2008-05-20 18:35:26 -03:00
|
|
|
from test import support
|
2020-08-03 13:49:18 -03:00
|
|
|
from test.support import import_helper
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2020-08-03 13:49:18 -03:00
|
|
|
|
|
|
|
py_operator = import_helper.import_fresh_module('operator',
|
|
|
|
blocked=['_operator'])
|
|
|
|
c_operator = import_helper.import_fresh_module('operator',
|
|
|
|
fresh=['_operator'])
|
2013-04-20 14:21:44 -03:00
|
|
|
|
2005-12-29 11:59:19 -04:00
|
|
|
class Seq1:
|
|
|
|
def __init__(self, lst):
|
|
|
|
self.lst = lst
|
|
|
|
def __len__(self):
|
|
|
|
return len(self.lst)
|
|
|
|
def __getitem__(self, i):
|
|
|
|
return self.lst[i]
|
|
|
|
def __add__(self, other):
|
|
|
|
return self.lst + other.lst
|
|
|
|
def __mul__(self, other):
|
|
|
|
return self.lst * other
|
|
|
|
def __rmul__(self, other):
|
|
|
|
return other * self.lst
|
|
|
|
|
|
|
|
class Seq2(object):
|
|
|
|
def __init__(self, lst):
|
|
|
|
self.lst = lst
|
|
|
|
def __len__(self):
|
|
|
|
return len(self.lst)
|
|
|
|
def __getitem__(self, i):
|
|
|
|
return self.lst[i]
|
|
|
|
def __add__(self, other):
|
|
|
|
return self.lst + other.lst
|
|
|
|
def __mul__(self, other):
|
|
|
|
return self.lst * other
|
|
|
|
def __rmul__(self, other):
|
|
|
|
return other * self.lst
|
|
|
|
|
2020-06-22 04:43:35 -03:00
|
|
|
class BadIterable:
|
|
|
|
def __iter__(self):
|
|
|
|
raise ZeroDivisionError
|
|
|
|
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2013-04-20 14:21:44 -03:00
|
|
|
class OperatorTestCase:
|
2001-08-11 00:21:35 -03:00
|
|
|
def test_lt(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.lt)
|
|
|
|
self.assertRaises(TypeError, operator.lt, 1j, 2j)
|
|
|
|
self.assertFalse(operator.lt(1, 0))
|
|
|
|
self.assertFalse(operator.lt(1, 0.0))
|
|
|
|
self.assertFalse(operator.lt(1, 1))
|
|
|
|
self.assertFalse(operator.lt(1, 1.0))
|
|
|
|
self.assertTrue(operator.lt(1, 2))
|
|
|
|
self.assertTrue(operator.lt(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_le(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.le)
|
|
|
|
self.assertRaises(TypeError, operator.le, 1j, 2j)
|
|
|
|
self.assertFalse(operator.le(1, 0))
|
|
|
|
self.assertFalse(operator.le(1, 0.0))
|
|
|
|
self.assertTrue(operator.le(1, 1))
|
|
|
|
self.assertTrue(operator.le(1, 1.0))
|
|
|
|
self.assertTrue(operator.le(1, 2))
|
|
|
|
self.assertTrue(operator.le(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_eq(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2004-11-01 13:10:19 -04:00
|
|
|
class C(object):
|
|
|
|
def __eq__(self, other):
|
|
|
|
raise SyntaxError
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.eq)
|
|
|
|
self.assertRaises(SyntaxError, operator.eq, C(), C())
|
|
|
|
self.assertFalse(operator.eq(1, 0))
|
|
|
|
self.assertFalse(operator.eq(1, 0.0))
|
|
|
|
self.assertTrue(operator.eq(1, 1))
|
|
|
|
self.assertTrue(operator.eq(1, 1.0))
|
|
|
|
self.assertFalse(operator.eq(1, 2))
|
|
|
|
self.assertFalse(operator.eq(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_ne(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2004-11-01 13:10:19 -04:00
|
|
|
class C(object):
|
|
|
|
def __ne__(self, other):
|
|
|
|
raise SyntaxError
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.ne)
|
|
|
|
self.assertRaises(SyntaxError, operator.ne, C(), C())
|
|
|
|
self.assertTrue(operator.ne(1, 0))
|
|
|
|
self.assertTrue(operator.ne(1, 0.0))
|
|
|
|
self.assertFalse(operator.ne(1, 1))
|
|
|
|
self.assertFalse(operator.ne(1, 1.0))
|
|
|
|
self.assertTrue(operator.ne(1, 2))
|
|
|
|
self.assertTrue(operator.ne(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_ge(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.ge)
|
|
|
|
self.assertRaises(TypeError, operator.ge, 1j, 2j)
|
|
|
|
self.assertTrue(operator.ge(1, 0))
|
|
|
|
self.assertTrue(operator.ge(1, 0.0))
|
|
|
|
self.assertTrue(operator.ge(1, 1))
|
|
|
|
self.assertTrue(operator.ge(1, 1.0))
|
|
|
|
self.assertFalse(operator.ge(1, 2))
|
|
|
|
self.assertFalse(operator.ge(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_gt(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.gt)
|
|
|
|
self.assertRaises(TypeError, operator.gt, 1j, 2j)
|
|
|
|
self.assertTrue(operator.gt(1, 0))
|
|
|
|
self.assertTrue(operator.gt(1, 0.0))
|
|
|
|
self.assertFalse(operator.gt(1, 1))
|
|
|
|
self.assertFalse(operator.gt(1, 1.0))
|
|
|
|
self.assertFalse(operator.gt(1, 2))
|
|
|
|
self.assertFalse(operator.gt(1, 2.0))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_abs(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.abs)
|
|
|
|
self.assertRaises(TypeError, operator.abs, None)
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(operator.abs(-1), 1)
|
|
|
|
self.assertEqual(operator.abs(1), 1)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_add(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.add)
|
|
|
|
self.assertRaises(TypeError, operator.add, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.add(3, 4), 7)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_bitwise_and(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.and_)
|
|
|
|
self.assertRaises(TypeError, operator.and_, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.and_(0xf, 0xa), 0xa)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_concat(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.concat)
|
|
|
|
self.assertRaises(TypeError, operator.concat, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.concat('py', 'thon'), 'python')
|
|
|
|
self.assertEqual(operator.concat([1, 2], [3, 4]), [1, 2, 3, 4])
|
|
|
|
self.assertEqual(operator.concat(Seq1([5, 6]), Seq1([7])), [5, 6, 7])
|
|
|
|
self.assertEqual(operator.concat(Seq2([5, 6]), Seq2([7])), [5, 6, 7])
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.concat, 13, 29)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_countOf(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.countOf)
|
|
|
|
self.assertRaises(TypeError, operator.countOf, None, None)
|
2020-06-22 04:43:35 -03:00
|
|
|
self.assertRaises(ZeroDivisionError, operator.countOf, BadIterable(), 1)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
|
|
|
|
self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_delitem(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2001-08-11 00:21:35 -03:00
|
|
|
a = [4, 3, 2, 1]
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.delitem, a)
|
|
|
|
self.assertRaises(TypeError, operator.delitem, a, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertIsNone(operator.delitem(a, 1))
|
|
|
|
self.assertEqual(a, [4, 2, 1])
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_floordiv(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.floordiv, 5)
|
|
|
|
self.assertRaises(TypeError, operator.floordiv, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.floordiv(5, 2), 2)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_truediv(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.truediv, 5)
|
|
|
|
self.assertRaises(TypeError, operator.truediv, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.truediv(5, 2), 2.5)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_getitem(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2001-08-11 00:21:35 -03:00
|
|
|
a = range(10)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.getitem)
|
|
|
|
self.assertRaises(TypeError, operator.getitem, a, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.getitem(a, 2), 2)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_indexOf(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.indexOf)
|
|
|
|
self.assertRaises(TypeError, operator.indexOf, None, None)
|
2020-06-22 04:43:35 -03:00
|
|
|
self.assertRaises(ZeroDivisionError, operator.indexOf, BadIterable(), 1)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.indexOf([4, 3, 2, 1], 3), 1)
|
2001-08-11 00:21:35 -03:00
|
|
|
self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
|
|
|
|
|
|
|
|
def test_invert(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.invert)
|
|
|
|
self.assertRaises(TypeError, operator.invert, None)
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(operator.inv(4), -5)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_lshift(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.lshift)
|
|
|
|
self.assertRaises(TypeError, operator.lshift, None, 42)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.lshift(5, 1), 10)
|
|
|
|
self.assertEqual(operator.lshift(5, 0), 5)
|
2001-08-11 00:21:35 -03:00
|
|
|
self.assertRaises(ValueError, operator.lshift, 2, -1)
|
|
|
|
|
|
|
|
def test_mod(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.mod)
|
|
|
|
self.assertRaises(TypeError, operator.mod, None, 42)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.mod(5, 2), 1)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_mul(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.mul)
|
|
|
|
self.assertRaises(TypeError, operator.mul, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.mul(5, 2), 10)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2014-04-10 00:55:56 -03:00
|
|
|
def test_matmul(self):
|
|
|
|
operator = self.module
|
|
|
|
self.assertRaises(TypeError, operator.matmul)
|
|
|
|
self.assertRaises(TypeError, operator.matmul, 42, 42)
|
|
|
|
class M:
|
|
|
|
def __matmul__(self, other):
|
|
|
|
return other - 1
|
|
|
|
self.assertEqual(M() @ 42, 41)
|
|
|
|
|
2001-08-11 00:21:35 -03:00
|
|
|
def test_neg(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.neg)
|
|
|
|
self.assertRaises(TypeError, operator.neg, None)
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(operator.neg(5), -5)
|
|
|
|
self.assertEqual(operator.neg(-5), 5)
|
|
|
|
self.assertEqual(operator.neg(0), 0)
|
|
|
|
self.assertEqual(operator.neg(-0), 0)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_bitwise_or(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.or_)
|
|
|
|
self.assertRaises(TypeError, operator.or_, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.or_(0xa, 0x5), 0xf)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_pos(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.pos)
|
|
|
|
self.assertRaises(TypeError, operator.pos, None)
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(operator.pos(5), 5)
|
|
|
|
self.assertEqual(operator.pos(-5), -5)
|
|
|
|
self.assertEqual(operator.pos(0), 0)
|
|
|
|
self.assertEqual(operator.pos(-0), 0)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2002-08-19 00:19:09 -03:00
|
|
|
def test_pow(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.pow)
|
|
|
|
self.assertRaises(TypeError, operator.pow, None, None)
|
2007-07-11 09:20:59 -03:00
|
|
|
self.assertEqual(operator.pow(3,5), 3**5)
|
2002-08-19 00:19:09 -03:00
|
|
|
self.assertRaises(TypeError, operator.pow, 1)
|
|
|
|
self.assertRaises(TypeError, operator.pow, 1, 2, 3)
|
|
|
|
|
2001-08-11 00:21:35 -03:00
|
|
|
def test_rshift(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.rshift)
|
|
|
|
self.assertRaises(TypeError, operator.rshift, None, 42)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.rshift(5, 1), 2)
|
|
|
|
self.assertEqual(operator.rshift(5, 0), 5)
|
2001-08-11 00:21:35 -03:00
|
|
|
self.assertRaises(ValueError, operator.rshift, 2, -1)
|
|
|
|
|
|
|
|
def test_contains(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.contains)
|
|
|
|
self.assertRaises(TypeError, operator.contains, None, None)
|
2020-06-22 04:43:35 -03:00
|
|
|
self.assertRaises(ZeroDivisionError, operator.contains, BadIterable(), 1)
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertTrue(operator.contains(range(4), 2))
|
|
|
|
self.assertFalse(operator.contains(range(4), 5))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_setitem(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2007-05-07 19:24:25 -03:00
|
|
|
a = list(range(3))
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.setitem, a)
|
|
|
|
self.assertRaises(TypeError, operator.setitem, a, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertIsNone(operator.setitem(a, 0, 2))
|
|
|
|
self.assertEqual(a, [2, 1, 2])
|
2001-08-11 00:21:35 -03:00
|
|
|
self.assertRaises(IndexError, operator.setitem, a, 4, 2)
|
|
|
|
|
|
|
|
def test_sub(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.sub)
|
|
|
|
self.assertRaises(TypeError, operator.sub, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.sub(5, 2), 3)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_truth(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2004-11-01 13:10:19 -04:00
|
|
|
class C(object):
|
2006-11-28 15:15:13 -04:00
|
|
|
def __bool__(self):
|
2004-11-01 13:10:19 -04:00
|
|
|
raise SyntaxError
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.truth)
|
|
|
|
self.assertRaises(SyntaxError, operator.truth, C())
|
|
|
|
self.assertTrue(operator.truth(5))
|
|
|
|
self.assertTrue(operator.truth([0]))
|
|
|
|
self.assertFalse(operator.truth(0))
|
|
|
|
self.assertFalse(operator.truth([]))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
|
|
|
def test_bitwise_xor(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.xor)
|
|
|
|
self.assertRaises(TypeError, operator.xor, None, None)
|
2015-07-26 08:11:49 -03:00
|
|
|
self.assertEqual(operator.xor(0xb, 0xc), 0x7)
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2003-01-18 19:22:20 -04:00
|
|
|
def test_is(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2003-01-18 19:22:20 -04:00
|
|
|
a = b = 'xyzpdq'
|
|
|
|
c = a[:3] + b[3:]
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.is_)
|
|
|
|
self.assertTrue(operator.is_(a, b))
|
|
|
|
self.assertFalse(operator.is_(a,c))
|
2003-01-18 19:22:20 -04:00
|
|
|
|
|
|
|
def test_is_not(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2003-01-18 19:22:20 -04:00
|
|
|
a = b = 'xyzpdq'
|
|
|
|
c = a[:3] + b[3:]
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(TypeError, operator.is_not)
|
|
|
|
self.assertFalse(operator.is_not(a, b))
|
|
|
|
self.assertTrue(operator.is_not(a,c))
|
2001-08-11 00:21:35 -03:00
|
|
|
|
2003-12-01 09:18:39 -04:00
|
|
|
def test_attrgetter(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2003-12-01 09:18:39 -04:00
|
|
|
class A:
|
|
|
|
pass
|
|
|
|
a = A()
|
|
|
|
a.name = 'arthur'
|
|
|
|
f = operator.attrgetter('name')
|
|
|
|
self.assertEqual(f(a), 'arthur')
|
2016-04-23 04:51:39 -03:00
|
|
|
self.assertRaises(TypeError, f)
|
|
|
|
self.assertRaises(TypeError, f, a, 'dent')
|
|
|
|
self.assertRaises(TypeError, f, a, surname='dent')
|
2003-12-01 09:18:39 -04:00
|
|
|
f = operator.attrgetter('rank')
|
|
|
|
self.assertRaises(AttributeError, f, a)
|
2010-10-31 12:26:04 -03:00
|
|
|
self.assertRaises(TypeError, operator.attrgetter, 2)
|
2003-12-01 09:18:39 -04:00
|
|
|
self.assertRaises(TypeError, operator.attrgetter)
|
2005-03-09 12:38:48 -04:00
|
|
|
|
|
|
|
# multiple gets
|
|
|
|
record = A()
|
|
|
|
record.x = 'X'
|
|
|
|
record.y = 'Y'
|
|
|
|
record.z = 'Z'
|
|
|
|
self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
|
2010-10-31 12:26:04 -03:00
|
|
|
self.assertRaises(TypeError, operator.attrgetter, ('x', (), 'y'))
|
2003-12-01 09:18:39 -04:00
|
|
|
|
2004-11-01 13:10:19 -04:00
|
|
|
class C(object):
|
Merged revisions 60124-60142 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r60131 | georg.brandl | 2008-01-20 12:13:29 +0100 (Sun, 20 Jan 2008) | 3 lines
#1351692: in pprint, always call format() for dict and list items to enable
custom formatting of contents via subclassing PrettyPrinter.
........
r60133 | georg.brandl | 2008-01-20 12:43:03 +0100 (Sun, 20 Jan 2008) | 2 lines
#1178141: add addinfourl.code to get http status code from urllib.
........
r60134 | georg.brandl | 2008-01-20 13:05:43 +0100 (Sun, 20 Jan 2008) | 4 lines
#856047: respect the ``no_proxy`` env var when checking for proxies
in urllib and using the other ``_proxy`` env vars.
Original patch by Donovan Baarda.
........
r60135 | georg.brandl | 2008-01-20 13:18:17 +0100 (Sun, 20 Jan 2008) | 4 lines
#1664522: in urllib, don't read non-existing directories in ftp mode,
returning a 0-byte file -- raise an IOError instead.
Original patch from Phil Knirsch.
........
r60136 | georg.brandl | 2008-01-20 13:57:47 +0100 (Sun, 20 Jan 2008) | 2 lines
#799369: document possible sys.platform values.
........
r60137 | georg.brandl | 2008-01-20 14:08:37 +0100 (Sun, 20 Jan 2008) | 2 lines
#652749: document the constants added to the builtins by site.py.
........
r60138 | georg.brandl | 2008-01-20 14:59:46 +0100 (Sun, 20 Jan 2008) | 2 lines
#1648: add sys.gettrace() and sys.getprofile().
........
r60139 | georg.brandl | 2008-01-20 15:17:42 +0100 (Sun, 20 Jan 2008) | 2 lines
#1669: don't allow shutil.rmtree() to be called on a symlink.
........
r60140 | georg.brandl | 2008-01-20 15:20:02 +0100 (Sun, 20 Jan 2008) | 2 lines
Fix test_pyclbr after urllib change.
........
r60141 | christian.heimes | 2008-01-20 15:28:28 +0100 (Sun, 20 Jan 2008) | 1 line
Fixed a wrong assumption in configure.in and Include/pyport.h. The is finite function is not called isfinite() but finite(). Sorry, my fault. :)
........
r60142 | georg.brandl | 2008-01-20 15:31:27 +0100 (Sun, 20 Jan 2008) | 2 lines
#1876: fix typos in test_operator.
........
2008-01-20 11:14:11 -04:00
|
|
|
def __getattr__(self, name):
|
2004-11-01 13:10:19 -04:00
|
|
|
raise SyntaxError
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
|
2004-11-01 13:10:19 -04:00
|
|
|
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
# recursive gets
|
|
|
|
a = A()
|
|
|
|
a.name = 'arthur'
|
|
|
|
a.child = A()
|
|
|
|
a.child.name = 'thomas'
|
|
|
|
f = operator.attrgetter('child.name')
|
|
|
|
self.assertEqual(f(a), 'thomas')
|
|
|
|
self.assertRaises(AttributeError, f, a.child)
|
|
|
|
f = operator.attrgetter('name', 'child.name')
|
|
|
|
self.assertEqual(f(a), ('arthur', 'thomas'))
|
|
|
|
f = operator.attrgetter('name', 'child.name', 'child.child.name')
|
|
|
|
self.assertRaises(AttributeError, f, a)
|
2010-10-31 12:26:04 -03:00
|
|
|
f = operator.attrgetter('child.')
|
|
|
|
self.assertRaises(AttributeError, f, a)
|
|
|
|
f = operator.attrgetter('.child')
|
|
|
|
self.assertRaises(AttributeError, f, a)
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
|
|
|
|
a.child.child = A()
|
|
|
|
a.child.child.name = 'johnson'
|
|
|
|
f = operator.attrgetter('child.child.name')
|
|
|
|
self.assertEqual(f(a), 'johnson')
|
|
|
|
f = operator.attrgetter('name', 'child.name', 'child.child.name')
|
|
|
|
self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
|
|
|
|
|
2003-12-01 09:18:39 -04:00
|
|
|
def test_itemgetter(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2003-12-01 09:18:39 -04:00
|
|
|
a = 'ABCDE'
|
|
|
|
f = operator.itemgetter(2)
|
|
|
|
self.assertEqual(f(a), 'C')
|
2016-04-23 04:51:39 -03:00
|
|
|
self.assertRaises(TypeError, f)
|
|
|
|
self.assertRaises(TypeError, f, a, 3)
|
|
|
|
self.assertRaises(TypeError, f, a, size=3)
|
2003-12-01 09:18:39 -04:00
|
|
|
f = operator.itemgetter(10)
|
|
|
|
self.assertRaises(IndexError, f, a)
|
|
|
|
|
2004-11-01 13:10:19 -04:00
|
|
|
class C(object):
|
Merged revisions 60124-60142 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r60131 | georg.brandl | 2008-01-20 12:13:29 +0100 (Sun, 20 Jan 2008) | 3 lines
#1351692: in pprint, always call format() for dict and list items to enable
custom formatting of contents via subclassing PrettyPrinter.
........
r60133 | georg.brandl | 2008-01-20 12:43:03 +0100 (Sun, 20 Jan 2008) | 2 lines
#1178141: add addinfourl.code to get http status code from urllib.
........
r60134 | georg.brandl | 2008-01-20 13:05:43 +0100 (Sun, 20 Jan 2008) | 4 lines
#856047: respect the ``no_proxy`` env var when checking for proxies
in urllib and using the other ``_proxy`` env vars.
Original patch by Donovan Baarda.
........
r60135 | georg.brandl | 2008-01-20 13:18:17 +0100 (Sun, 20 Jan 2008) | 4 lines
#1664522: in urllib, don't read non-existing directories in ftp mode,
returning a 0-byte file -- raise an IOError instead.
Original patch from Phil Knirsch.
........
r60136 | georg.brandl | 2008-01-20 13:57:47 +0100 (Sun, 20 Jan 2008) | 2 lines
#799369: document possible sys.platform values.
........
r60137 | georg.brandl | 2008-01-20 14:08:37 +0100 (Sun, 20 Jan 2008) | 2 lines
#652749: document the constants added to the builtins by site.py.
........
r60138 | georg.brandl | 2008-01-20 14:59:46 +0100 (Sun, 20 Jan 2008) | 2 lines
#1648: add sys.gettrace() and sys.getprofile().
........
r60139 | georg.brandl | 2008-01-20 15:17:42 +0100 (Sun, 20 Jan 2008) | 2 lines
#1669: don't allow shutil.rmtree() to be called on a symlink.
........
r60140 | georg.brandl | 2008-01-20 15:20:02 +0100 (Sun, 20 Jan 2008) | 2 lines
Fix test_pyclbr after urllib change.
........
r60141 | christian.heimes | 2008-01-20 15:28:28 +0100 (Sun, 20 Jan 2008) | 1 line
Fixed a wrong assumption in configure.in and Include/pyport.h. The is finite function is not called isfinite() but finite(). Sorry, my fault. :)
........
r60142 | georg.brandl | 2008-01-20 15:31:27 +0100 (Sun, 20 Jan 2008) | 2 lines
#1876: fix typos in test_operator.
........
2008-01-20 11:14:11 -04:00
|
|
|
def __getitem__(self, name):
|
2004-11-01 13:10:19 -04:00
|
|
|
raise SyntaxError
|
2009-06-30 20:06:06 -03:00
|
|
|
self.assertRaises(SyntaxError, operator.itemgetter(42), C())
|
2004-11-01 13:10:19 -04:00
|
|
|
|
2003-12-01 09:18:39 -04:00
|
|
|
f = operator.itemgetter('name')
|
|
|
|
self.assertRaises(TypeError, f, a)
|
|
|
|
self.assertRaises(TypeError, operator.itemgetter)
|
|
|
|
|
|
|
|
d = dict(key='val')
|
|
|
|
f = operator.itemgetter('key')
|
|
|
|
self.assertEqual(f(d), 'val')
|
|
|
|
f = operator.itemgetter('nonkey')
|
|
|
|
self.assertRaises(KeyError, f, d)
|
|
|
|
|
|
|
|
# example used in the docs
|
|
|
|
inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
|
|
|
|
getcount = operator.itemgetter(1)
|
Merged revisions 56125-56153 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r56127 | georg.brandl | 2007-06-30 09:32:49 +0200 (Sat, 30 Jun 2007) | 2 lines
Fix a place where floor division would be in order.
........
r56135 | guido.van.rossum | 2007-07-01 06:13:54 +0200 (Sun, 01 Jul 2007) | 28 lines
Make map() and filter() identical to itertools.imap() and .ifilter(),
respectively.
I fixed two bootstrap issues, due to the dynamic import of itertools:
1. Starting python requires that map() and filter() are not used until
site.py has added build/lib.<arch> to sys.path.
2. Building python requires that setup.py and distutils and everything
they use is free of map() and filter() calls.
Beyond this, I only fixed the tests in test_builtin.py.
Others, please help fixing the remaining tests that are now broken!
The fixes are usually simple:
a. map(None, X) -> list(X)
b. map(F, X) -> list(map(F, X))
c. map(lambda x: F(x), X) -> [F(x) for x in X]
d. filter(F, X) -> list(filter(F, X))
e. filter(lambda x: P(x), X) -> [x for x in X if P(x)]
Someone, please also contribute a fixer for 2to3 to do this.
It can leave map()/filter() calls alone that are already
inside a list() or sorted() call or for-loop.
Only in rare cases have I seen code that depends on map() of lists
of different lengths going to the end of the longest, or on filter()
of a string or tuple returning an object of the same type; these
will need more thought to fix.
........
r56136 | guido.van.rossum | 2007-07-01 06:22:01 +0200 (Sun, 01 Jul 2007) | 3 lines
Make it so that test_decimal fails instead of hangs, to help automated
test runners.
........
r56139 | georg.brandl | 2007-07-01 18:20:58 +0200 (Sun, 01 Jul 2007) | 2 lines
Fix a few test cases after the map->imap change.
........
r56142 | neal.norwitz | 2007-07-02 06:38:12 +0200 (Mon, 02 Jul 2007) | 1 line
Get a bunch more tests passing after converting map/filter to return iterators.
........
r56147 | guido.van.rossum | 2007-07-02 15:32:02 +0200 (Mon, 02 Jul 2007) | 4 lines
Fix the remaining failing unit tests (at least on OSX).
Also tweaked urllib2 so it doesn't raise socket.gaierror when
all network interfaces are turned off.
........
2007-07-03 05:25:58 -03:00
|
|
|
self.assertEqual(list(map(getcount, inventory)), [3, 2, 5, 1])
|
2003-12-17 16:43:33 -04:00
|
|
|
self.assertEqual(sorted(inventory, key=getcount),
|
2003-12-01 09:18:39 -04:00
|
|
|
[('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
|
|
|
|
|
2005-03-09 12:38:48 -04:00
|
|
|
# multiple gets
|
Merged revisions 56125-56153 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
........
r56127 | georg.brandl | 2007-06-30 09:32:49 +0200 (Sat, 30 Jun 2007) | 2 lines
Fix a place where floor division would be in order.
........
r56135 | guido.van.rossum | 2007-07-01 06:13:54 +0200 (Sun, 01 Jul 2007) | 28 lines
Make map() and filter() identical to itertools.imap() and .ifilter(),
respectively.
I fixed two bootstrap issues, due to the dynamic import of itertools:
1. Starting python requires that map() and filter() are not used until
site.py has added build/lib.<arch> to sys.path.
2. Building python requires that setup.py and distutils and everything
they use is free of map() and filter() calls.
Beyond this, I only fixed the tests in test_builtin.py.
Others, please help fixing the remaining tests that are now broken!
The fixes are usually simple:
a. map(None, X) -> list(X)
b. map(F, X) -> list(map(F, X))
c. map(lambda x: F(x), X) -> [F(x) for x in X]
d. filter(F, X) -> list(filter(F, X))
e. filter(lambda x: P(x), X) -> [x for x in X if P(x)]
Someone, please also contribute a fixer for 2to3 to do this.
It can leave map()/filter() calls alone that are already
inside a list() or sorted() call or for-loop.
Only in rare cases have I seen code that depends on map() of lists
of different lengths going to the end of the longest, or on filter()
of a string or tuple returning an object of the same type; these
will need more thought to fix.
........
r56136 | guido.van.rossum | 2007-07-01 06:22:01 +0200 (Sun, 01 Jul 2007) | 3 lines
Make it so that test_decimal fails instead of hangs, to help automated
test runners.
........
r56139 | georg.brandl | 2007-07-01 18:20:58 +0200 (Sun, 01 Jul 2007) | 2 lines
Fix a few test cases after the map->imap change.
........
r56142 | neal.norwitz | 2007-07-02 06:38:12 +0200 (Mon, 02 Jul 2007) | 1 line
Get a bunch more tests passing after converting map/filter to return iterators.
........
r56147 | guido.van.rossum | 2007-07-02 15:32:02 +0200 (Mon, 02 Jul 2007) | 4 lines
Fix the remaining failing unit tests (at least on OSX).
Also tweaked urllib2 so it doesn't raise socket.gaierror when
all network interfaces are turned off.
........
2007-07-03 05:25:58 -03:00
|
|
|
data = list(map(str, range(20)))
|
2005-03-09 12:38:48 -04:00
|
|
|
self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
|
|
|
|
self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
|
|
|
|
|
2019-01-07 12:38:41 -04:00
|
|
|
# interesting indices
|
|
|
|
t = tuple('abcde')
|
|
|
|
self.assertEqual(operator.itemgetter(-1)(t), 'e')
|
|
|
|
self.assertEqual(operator.itemgetter(slice(2, 4))(t), ('c', 'd'))
|
|
|
|
|
|
|
|
# interesting sequences
|
|
|
|
class T(tuple):
|
|
|
|
'Tuple subclass'
|
|
|
|
pass
|
|
|
|
self.assertEqual(operator.itemgetter(0)(T('abc')), 'a')
|
|
|
|
self.assertEqual(operator.itemgetter(0)(['a', 'b', 'c']), 'a')
|
|
|
|
self.assertEqual(operator.itemgetter(0)(range(100, 200)), 100)
|
|
|
|
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
def test_methodcaller(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
self.assertRaises(TypeError, operator.methodcaller)
|
2015-05-20 12:29:18 -03:00
|
|
|
self.assertRaises(TypeError, operator.methodcaller, 12)
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
class A:
|
|
|
|
def foo(self, *args, **kwds):
|
|
|
|
return args[0] + args[1]
|
|
|
|
def bar(self, f=42):
|
|
|
|
return f
|
2013-04-20 14:21:44 -03:00
|
|
|
def baz(*args, **kwds):
|
|
|
|
return kwds['name'], kwds['self']
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
a = A()
|
|
|
|
f = operator.methodcaller('foo')
|
|
|
|
self.assertRaises(IndexError, f, a)
|
|
|
|
f = operator.methodcaller('foo', 1, 2)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(f(a), 3)
|
2016-04-23 04:51:39 -03:00
|
|
|
self.assertRaises(TypeError, f)
|
|
|
|
self.assertRaises(TypeError, f, a, 3)
|
|
|
|
self.assertRaises(TypeError, f, a, spam=3)
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
f = operator.methodcaller('bar')
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(f(a), 42)
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
self.assertRaises(TypeError, f, a, a)
|
|
|
|
f = operator.methodcaller('bar', f=5)
|
2010-11-20 15:04:17 -04:00
|
|
|
self.assertEqual(f(a), 5)
|
2013-04-20 14:21:44 -03:00
|
|
|
f = operator.methodcaller('baz', name='spam', self='eggs')
|
|
|
|
self.assertEqual(f(a), ('spam', 'eggs'))
|
Merged revisions 61003-61033 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r61004 | georg.brandl | 2008-02-23 19:47:04 +0100 (Sat, 23 Feb 2008) | 2 lines
Documentation coverage builder, part 1.
........
r61006 | andrew.kuchling | 2008-02-23 20:02:33 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051: IMAP module tries to read entire message in one chunk. Patch by Fredrik Lundh.
........
r61008 | andrew.kuchling | 2008-02-23 20:28:58 +0100 (Sat, 23 Feb 2008) | 1 line
#1389051, #1092502: fix excessively large allocations when using read() on a socket
........
r61011 | jeffrey.yasskin | 2008-02-23 20:40:54 +0100 (Sat, 23 Feb 2008) | 13 lines
Prevent classes like:
class RunSelfFunction(object):
def __init__(self):
self.thread = threading.Thread(target=self._run)
self.thread.start()
def _run(self):
pass
from creating a permanent cycle between the object and the thread by having the
Thread delete its references to the object when it completes.
As an example of the effect of this bug, paramiko.Transport inherits from
Thread to avoid it.
........
r61013 | jeffrey.yasskin | 2008-02-23 21:40:35 +0100 (Sat, 23 Feb 2008) | 3 lines
Followup to r61011: Also avoid the reference cycle when the Thread's target
raises an exception.
........
r61017 | georg.brandl | 2008-02-23 22:59:11 +0100 (Sat, 23 Feb 2008) | 2 lines
#2101: fix removeAttribute docs.
........
r61018 | georg.brandl | 2008-02-23 23:05:38 +0100 (Sat, 23 Feb 2008) | 2 lines
Add examples to modulefinder docs. Written for GHOP by Josip Dzolonga.
........
r61019 | georg.brandl | 2008-02-23 23:09:24 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange() in popen2.
........
r61020 | georg.brandl | 2008-02-23 23:14:02 +0100 (Sat, 23 Feb 2008) | 2 lines
Use os.closerange().
........
r61021 | georg.brandl | 2008-02-23 23:35:33 +0100 (Sat, 23 Feb 2008) | 3 lines
In test_heapq and test_bisect, test both the Python and the C implementation.
Originally written for GHOP by Josip Dzolonga, heavily patched by me.
........
r61024 | facundo.batista | 2008-02-23 23:54:12 +0100 (Sat, 23 Feb 2008) | 3 lines
Added simple test case. Thanks Benjamin Peterson.
........
r61025 | georg.brandl | 2008-02-23 23:55:18 +0100 (Sat, 23 Feb 2008) | 2 lines
#1825: correctly document msilib.add_data.
........
r61027 | georg.brandl | 2008-02-24 00:02:23 +0100 (Sun, 24 Feb 2008) | 2 lines
#1826: allow dotted attribute paths in operator.attrgetter.
........
r61028 | georg.brandl | 2008-02-24 00:04:35 +0100 (Sun, 24 Feb 2008) | 2 lines
#1506171: added operator.methodcaller().
........
r61029 | georg.brandl | 2008-02-24 00:25:26 +0100 (Sun, 24 Feb 2008) | 2 lines
Document import ./. threading issues. #1720705.
........
r61032 | georg.brandl | 2008-02-24 00:43:01 +0100 (Sun, 24 Feb 2008) | 2 lines
Specify what kind of warning -3 emits.
........
r61033 | christian.heimes | 2008-02-24 00:59:45 +0100 (Sun, 24 Feb 2008) | 1 line
MS Windows doesn't have mode_t but stat.st_mode is defined as unsigned short.
........
2008-02-23 20:38:49 -04:00
|
|
|
|
2005-12-29 12:50:42 -04:00
|
|
|
def test_inplace(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2005-12-29 12:50:42 -04:00
|
|
|
class C(object):
|
|
|
|
def __iadd__ (self, other): return "iadd"
|
|
|
|
def __iand__ (self, other): return "iand"
|
|
|
|
def __ifloordiv__(self, other): return "ifloordiv"
|
|
|
|
def __ilshift__ (self, other): return "ilshift"
|
|
|
|
def __imod__ (self, other): return "imod"
|
|
|
|
def __imul__ (self, other): return "imul"
|
2014-04-10 00:55:56 -03:00
|
|
|
def __imatmul__ (self, other): return "imatmul"
|
2005-12-29 12:50:42 -04:00
|
|
|
def __ior__ (self, other): return "ior"
|
|
|
|
def __ipow__ (self, other): return "ipow"
|
|
|
|
def __irshift__ (self, other): return "irshift"
|
|
|
|
def __isub__ (self, other): return "isub"
|
|
|
|
def __itruediv__ (self, other): return "itruediv"
|
|
|
|
def __ixor__ (self, other): return "ixor"
|
|
|
|
def __getitem__(self, other): return 5 # so that C is a sequence
|
|
|
|
c = C()
|
|
|
|
self.assertEqual(operator.iadd (c, 5), "iadd")
|
|
|
|
self.assertEqual(operator.iand (c, 5), "iand")
|
|
|
|
self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
|
|
|
|
self.assertEqual(operator.ilshift (c, 5), "ilshift")
|
|
|
|
self.assertEqual(operator.imod (c, 5), "imod")
|
|
|
|
self.assertEqual(operator.imul (c, 5), "imul")
|
2014-04-10 00:55:56 -03:00
|
|
|
self.assertEqual(operator.imatmul (c, 5), "imatmul")
|
2005-12-29 12:50:42 -04:00
|
|
|
self.assertEqual(operator.ior (c, 5), "ior")
|
|
|
|
self.assertEqual(operator.ipow (c, 5), "ipow")
|
|
|
|
self.assertEqual(operator.irshift (c, 5), "irshift")
|
|
|
|
self.assertEqual(operator.isub (c, 5), "isub")
|
|
|
|
self.assertEqual(operator.itruediv (c, 5), "itruediv")
|
|
|
|
self.assertEqual(operator.ixor (c, 5), "ixor")
|
|
|
|
self.assertEqual(operator.iconcat (c, c), "iadd")
|
2005-03-09 12:38:48 -04:00
|
|
|
|
2012-10-06 09:03:24 -03:00
|
|
|
def test_length_hint(self):
|
2013-04-20 14:21:44 -03:00
|
|
|
operator = self.module
|
2012-10-06 09:03:24 -03:00
|
|
|
class X(object):
|
|
|
|
def __init__(self, value):
|
|
|
|
self.value = value
|
|
|
|
|
|
|
|
def __length_hint__(self):
|
|
|
|
if type(self.value) is type:
|
|
|
|
raise self.value
|
|
|
|
else:
|
|
|
|
return self.value
|
|
|
|
|
|
|
|
self.assertEqual(operator.length_hint([], 2), 0)
|
|
|
|
self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
|
|
|
|
|
|
|
|
self.assertEqual(operator.length_hint(X(2)), 2)
|
|
|
|
self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
|
|
|
|
self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
|
|
|
|
with self.assertRaises(TypeError):
|
|
|
|
operator.length_hint(X("abc"))
|
|
|
|
with self.assertRaises(ValueError):
|
|
|
|
operator.length_hint(X(-2))
|
|
|
|
with self.assertRaises(LookupError):
|
|
|
|
operator.length_hint(X(LookupError))
|
|
|
|
|
2013-04-20 14:21:44 -03:00
|
|
|
def test_dunder_is_original(self):
|
|
|
|
operator = self.module
|
2012-10-06 09:03:24 -03:00
|
|
|
|
2013-04-20 14:21:44 -03:00
|
|
|
names = [name for name in dir(operator) if not name.startswith('_')]
|
|
|
|
for name in names:
|
|
|
|
orig = getattr(operator, name)
|
|
|
|
dunder = getattr(operator, '__' + name.strip('_') + '__', None)
|
|
|
|
if dunder:
|
|
|
|
self.assertIs(dunder, orig)
|
2005-03-09 12:38:48 -04:00
|
|
|
|
2013-04-20 14:21:44 -03:00
|
|
|
class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
|
|
|
|
module = py_operator
|
2001-09-20 18:33:42 -03:00
|
|
|
|
2013-04-20 14:21:44 -03:00
|
|
|
@unittest.skipUnless(c_operator, 'requires _operator')
|
|
|
|
class COperatorTestCase(OperatorTestCase, unittest.TestCase):
|
|
|
|
module = c_operator
|
2001-09-20 18:33:42 -03:00
|
|
|
|
2015-05-20 12:29:18 -03:00
|
|
|
|
|
|
|
class OperatorPickleTestCase:
|
|
|
|
def copy(self, obj, proto):
|
|
|
|
with support.swap_item(sys.modules, 'operator', self.module):
|
|
|
|
pickled = pickle.dumps(obj, proto)
|
|
|
|
with support.swap_item(sys.modules, 'operator', self.module2):
|
|
|
|
return pickle.loads(pickled)
|
|
|
|
|
|
|
|
def test_attrgetter(self):
|
|
|
|
attrgetter = self.module.attrgetter
|
|
|
|
class A:
|
|
|
|
pass
|
|
|
|
a = A()
|
|
|
|
a.x = 'X'
|
|
|
|
a.y = 'Y'
|
|
|
|
a.z = 'Z'
|
|
|
|
a.t = A()
|
|
|
|
a.t.u = A()
|
|
|
|
a.t.u.v = 'V'
|
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
|
|
|
with self.subTest(proto=proto):
|
|
|
|
f = attrgetter('x')
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
# multiple gets
|
|
|
|
f = attrgetter('x', 'y', 'z')
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
# recursive gets
|
|
|
|
f = attrgetter('t.u.v')
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
|
|
|
|
def test_itemgetter(self):
|
|
|
|
itemgetter = self.module.itemgetter
|
|
|
|
a = 'ABCDE'
|
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
|
|
|
with self.subTest(proto=proto):
|
|
|
|
f = itemgetter(2)
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
# multiple gets
|
|
|
|
f = itemgetter(2, 0, 4)
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
|
|
|
|
def test_methodcaller(self):
|
|
|
|
methodcaller = self.module.methodcaller
|
|
|
|
class A:
|
|
|
|
def foo(self, *args, **kwds):
|
|
|
|
return args[0] + args[1]
|
|
|
|
def bar(self, f=42):
|
|
|
|
return f
|
|
|
|
def baz(*args, **kwds):
|
|
|
|
return kwds['name'], kwds['self']
|
|
|
|
a = A()
|
|
|
|
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
|
|
|
with self.subTest(proto=proto):
|
|
|
|
f = methodcaller('bar')
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
# positional args
|
|
|
|
f = methodcaller('foo', 1, 2)
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
# keyword args
|
|
|
|
f = methodcaller('bar', f=5)
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
self.assertEqual(repr(f2), repr(f))
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
f = methodcaller('baz', self='eggs', name='spam')
|
|
|
|
f2 = self.copy(f, proto)
|
|
|
|
# Can't test repr consistently with multiple keyword args
|
|
|
|
self.assertEqual(f2(a), f(a))
|
|
|
|
|
|
|
|
class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
|
|
|
|
module = py_operator
|
|
|
|
module2 = py_operator
|
|
|
|
|
|
|
|
@unittest.skipUnless(c_operator, 'requires _operator')
|
|
|
|
class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
|
|
|
|
module = py_operator
|
|
|
|
module2 = c_operator
|
|
|
|
|
|
|
|
@unittest.skipUnless(c_operator, 'requires _operator')
|
|
|
|
class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
|
|
|
|
module = c_operator
|
|
|
|
module2 = py_operator
|
|
|
|
|
|
|
|
@unittest.skipUnless(c_operator, 'requires _operator')
|
|
|
|
class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
|
|
|
|
module = c_operator
|
|
|
|
module2 = c_operator
|
|
|
|
|
|
|
|
|
2001-09-20 18:33:42 -03:00
|
|
|
if __name__ == "__main__":
|
2013-04-20 14:21:44 -03:00
|
|
|
unittest.main()
|