test_operator.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. import unittest
  2. import pickle
  3. import sys
  4. from test import support
  5. from test.support import import_helper
  6. py_operator = import_helper.import_fresh_module('operator',
  7. blocked=['_operator'])
  8. c_operator = import_helper.import_fresh_module('operator',
  9. fresh=['_operator'])
  10. class Seq1:
  11. def __init__(self, lst):
  12. self.lst = lst
  13. def __len__(self):
  14. return len(self.lst)
  15. def __getitem__(self, i):
  16. return self.lst[i]
  17. def __add__(self, other):
  18. return self.lst + other.lst
  19. def __mul__(self, other):
  20. return self.lst * other
  21. def __rmul__(self, other):
  22. return other * self.lst
  23. class Seq2(object):
  24. def __init__(self, lst):
  25. self.lst = lst
  26. def __len__(self):
  27. return len(self.lst)
  28. def __getitem__(self, i):
  29. return self.lst[i]
  30. def __add__(self, other):
  31. return self.lst + other.lst
  32. def __mul__(self, other):
  33. return self.lst * other
  34. def __rmul__(self, other):
  35. return other * self.lst
  36. class BadIterable:
  37. def __iter__(self):
  38. raise ZeroDivisionError
  39. class OperatorTestCase:
  40. def test___all__(self):
  41. operator = self.module
  42. actual_all = set(operator.__all__)
  43. computed_all = set()
  44. for name in vars(operator):
  45. if name.startswith('__'):
  46. continue
  47. value = getattr(operator, name)
  48. if value.__module__ in ('operator', '_operator'):
  49. computed_all.add(name)
  50. self.assertSetEqual(computed_all, actual_all)
  51. def test_lt(self):
  52. operator = self.module
  53. self.assertRaises(TypeError, operator.lt)
  54. self.assertRaises(TypeError, operator.lt, 1j, 2j)
  55. self.assertFalse(operator.lt(1, 0))
  56. self.assertFalse(operator.lt(1, 0.0))
  57. self.assertFalse(operator.lt(1, 1))
  58. self.assertFalse(operator.lt(1, 1.0))
  59. self.assertTrue(operator.lt(1, 2))
  60. self.assertTrue(operator.lt(1, 2.0))
  61. def test_le(self):
  62. operator = self.module
  63. self.assertRaises(TypeError, operator.le)
  64. self.assertRaises(TypeError, operator.le, 1j, 2j)
  65. self.assertFalse(operator.le(1, 0))
  66. self.assertFalse(operator.le(1, 0.0))
  67. self.assertTrue(operator.le(1, 1))
  68. self.assertTrue(operator.le(1, 1.0))
  69. self.assertTrue(operator.le(1, 2))
  70. self.assertTrue(operator.le(1, 2.0))
  71. def test_eq(self):
  72. operator = self.module
  73. class C(object):
  74. def __eq__(self, other):
  75. raise SyntaxError
  76. self.assertRaises(TypeError, operator.eq)
  77. self.assertRaises(SyntaxError, operator.eq, C(), C())
  78. self.assertFalse(operator.eq(1, 0))
  79. self.assertFalse(operator.eq(1, 0.0))
  80. self.assertTrue(operator.eq(1, 1))
  81. self.assertTrue(operator.eq(1, 1.0))
  82. self.assertFalse(operator.eq(1, 2))
  83. self.assertFalse(operator.eq(1, 2.0))
  84. def test_ne(self):
  85. operator = self.module
  86. class C(object):
  87. def __ne__(self, other):
  88. raise SyntaxError
  89. self.assertRaises(TypeError, operator.ne)
  90. self.assertRaises(SyntaxError, operator.ne, C(), C())
  91. self.assertTrue(operator.ne(1, 0))
  92. self.assertTrue(operator.ne(1, 0.0))
  93. self.assertFalse(operator.ne(1, 1))
  94. self.assertFalse(operator.ne(1, 1.0))
  95. self.assertTrue(operator.ne(1, 2))
  96. self.assertTrue(operator.ne(1, 2.0))
  97. def test_ge(self):
  98. operator = self.module
  99. self.assertRaises(TypeError, operator.ge)
  100. self.assertRaises(TypeError, operator.ge, 1j, 2j)
  101. self.assertTrue(operator.ge(1, 0))
  102. self.assertTrue(operator.ge(1, 0.0))
  103. self.assertTrue(operator.ge(1, 1))
  104. self.assertTrue(operator.ge(1, 1.0))
  105. self.assertFalse(operator.ge(1, 2))
  106. self.assertFalse(operator.ge(1, 2.0))
  107. def test_gt(self):
  108. operator = self.module
  109. self.assertRaises(TypeError, operator.gt)
  110. self.assertRaises(TypeError, operator.gt, 1j, 2j)
  111. self.assertTrue(operator.gt(1, 0))
  112. self.assertTrue(operator.gt(1, 0.0))
  113. self.assertFalse(operator.gt(1, 1))
  114. self.assertFalse(operator.gt(1, 1.0))
  115. self.assertFalse(operator.gt(1, 2))
  116. self.assertFalse(operator.gt(1, 2.0))
  117. def test_abs(self):
  118. operator = self.module
  119. self.assertRaises(TypeError, operator.abs)
  120. self.assertRaises(TypeError, operator.abs, None)
  121. self.assertEqual(operator.abs(-1), 1)
  122. self.assertEqual(operator.abs(1), 1)
  123. def test_add(self):
  124. operator = self.module
  125. self.assertRaises(TypeError, operator.add)
  126. self.assertRaises(TypeError, operator.add, None, None)
  127. self.assertEqual(operator.add(3, 4), 7)
  128. def test_bitwise_and(self):
  129. operator = self.module
  130. self.assertRaises(TypeError, operator.and_)
  131. self.assertRaises(TypeError, operator.and_, None, None)
  132. self.assertEqual(operator.and_(0xf, 0xa), 0xa)
  133. def test_concat(self):
  134. operator = self.module
  135. self.assertRaises(TypeError, operator.concat)
  136. self.assertRaises(TypeError, operator.concat, None, None)
  137. self.assertEqual(operator.concat('py', 'thon'), 'python')
  138. self.assertEqual(operator.concat([1, 2], [3, 4]), [1, 2, 3, 4])
  139. self.assertEqual(operator.concat(Seq1([5, 6]), Seq1([7])), [5, 6, 7])
  140. self.assertEqual(operator.concat(Seq2([5, 6]), Seq2([7])), [5, 6, 7])
  141. self.assertRaises(TypeError, operator.concat, 13, 29)
  142. def test_countOf(self):
  143. operator = self.module
  144. self.assertRaises(TypeError, operator.countOf)
  145. self.assertRaises(TypeError, operator.countOf, None, None)
  146. self.assertRaises(ZeroDivisionError, operator.countOf, BadIterable(), 1)
  147. self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 3), 1)
  148. self.assertEqual(operator.countOf([1, 2, 1, 3, 1, 4], 5), 0)
  149. # is but not ==
  150. nan = float("nan")
  151. self.assertEqual(operator.countOf([nan, nan, 21], nan), 2)
  152. # == but not is
  153. self.assertEqual(operator.countOf([{}, 1, {}, 2], {}), 2)
  154. def test_delitem(self):
  155. operator = self.module
  156. a = [4, 3, 2, 1]
  157. self.assertRaises(TypeError, operator.delitem, a)
  158. self.assertRaises(TypeError, operator.delitem, a, None)
  159. self.assertIsNone(operator.delitem(a, 1))
  160. self.assertEqual(a, [4, 2, 1])
  161. def test_floordiv(self):
  162. operator = self.module
  163. self.assertRaises(TypeError, operator.floordiv, 5)
  164. self.assertRaises(TypeError, operator.floordiv, None, None)
  165. self.assertEqual(operator.floordiv(5, 2), 2)
  166. def test_truediv(self):
  167. operator = self.module
  168. self.assertRaises(TypeError, operator.truediv, 5)
  169. self.assertRaises(TypeError, operator.truediv, None, None)
  170. self.assertEqual(operator.truediv(5, 2), 2.5)
  171. def test_getitem(self):
  172. operator = self.module
  173. a = range(10)
  174. self.assertRaises(TypeError, operator.getitem)
  175. self.assertRaises(TypeError, operator.getitem, a, None)
  176. self.assertEqual(operator.getitem(a, 2), 2)
  177. def test_indexOf(self):
  178. operator = self.module
  179. self.assertRaises(TypeError, operator.indexOf)
  180. self.assertRaises(TypeError, operator.indexOf, None, None)
  181. self.assertRaises(ZeroDivisionError, operator.indexOf, BadIterable(), 1)
  182. self.assertEqual(operator.indexOf([4, 3, 2, 1], 3), 1)
  183. self.assertRaises(ValueError, operator.indexOf, [4, 3, 2, 1], 0)
  184. nan = float("nan")
  185. self.assertEqual(operator.indexOf([nan, nan, 21], nan), 0)
  186. self.assertEqual(operator.indexOf([{}, 1, {}, 2], {}), 0)
  187. def test_invert(self):
  188. operator = self.module
  189. self.assertRaises(TypeError, operator.invert)
  190. self.assertRaises(TypeError, operator.invert, None)
  191. self.assertEqual(operator.inv(4), -5)
  192. def test_lshift(self):
  193. operator = self.module
  194. self.assertRaises(TypeError, operator.lshift)
  195. self.assertRaises(TypeError, operator.lshift, None, 42)
  196. self.assertEqual(operator.lshift(5, 1), 10)
  197. self.assertEqual(operator.lshift(5, 0), 5)
  198. self.assertRaises(ValueError, operator.lshift, 2, -1)
  199. def test_mod(self):
  200. operator = self.module
  201. self.assertRaises(TypeError, operator.mod)
  202. self.assertRaises(TypeError, operator.mod, None, 42)
  203. self.assertEqual(operator.mod(5, 2), 1)
  204. def test_mul(self):
  205. operator = self.module
  206. self.assertRaises(TypeError, operator.mul)
  207. self.assertRaises(TypeError, operator.mul, None, None)
  208. self.assertEqual(operator.mul(5, 2), 10)
  209. def test_matmul(self):
  210. operator = self.module
  211. self.assertRaises(TypeError, operator.matmul)
  212. self.assertRaises(TypeError, operator.matmul, 42, 42)
  213. class M:
  214. def __matmul__(self, other):
  215. return other - 1
  216. self.assertEqual(M() @ 42, 41)
  217. def test_neg(self):
  218. operator = self.module
  219. self.assertRaises(TypeError, operator.neg)
  220. self.assertRaises(TypeError, operator.neg, None)
  221. self.assertEqual(operator.neg(5), -5)
  222. self.assertEqual(operator.neg(-5), 5)
  223. self.assertEqual(operator.neg(0), 0)
  224. self.assertEqual(operator.neg(-0), 0)
  225. def test_bitwise_or(self):
  226. operator = self.module
  227. self.assertRaises(TypeError, operator.or_)
  228. self.assertRaises(TypeError, operator.or_, None, None)
  229. self.assertEqual(operator.or_(0xa, 0x5), 0xf)
  230. def test_pos(self):
  231. operator = self.module
  232. self.assertRaises(TypeError, operator.pos)
  233. self.assertRaises(TypeError, operator.pos, None)
  234. self.assertEqual(operator.pos(5), 5)
  235. self.assertEqual(operator.pos(-5), -5)
  236. self.assertEqual(operator.pos(0), 0)
  237. self.assertEqual(operator.pos(-0), 0)
  238. def test_pow(self):
  239. operator = self.module
  240. self.assertRaises(TypeError, operator.pow)
  241. self.assertRaises(TypeError, operator.pow, None, None)
  242. self.assertEqual(operator.pow(3,5), 3**5)
  243. self.assertRaises(TypeError, operator.pow, 1)
  244. self.assertRaises(TypeError, operator.pow, 1, 2, 3)
  245. def test_rshift(self):
  246. operator = self.module
  247. self.assertRaises(TypeError, operator.rshift)
  248. self.assertRaises(TypeError, operator.rshift, None, 42)
  249. self.assertEqual(operator.rshift(5, 1), 2)
  250. self.assertEqual(operator.rshift(5, 0), 5)
  251. self.assertRaises(ValueError, operator.rshift, 2, -1)
  252. def test_contains(self):
  253. operator = self.module
  254. self.assertRaises(TypeError, operator.contains)
  255. self.assertRaises(TypeError, operator.contains, None, None)
  256. self.assertRaises(ZeroDivisionError, operator.contains, BadIterable(), 1)
  257. self.assertTrue(operator.contains(range(4), 2))
  258. self.assertFalse(operator.contains(range(4), 5))
  259. def test_setitem(self):
  260. operator = self.module
  261. a = list(range(3))
  262. self.assertRaises(TypeError, operator.setitem, a)
  263. self.assertRaises(TypeError, operator.setitem, a, None, None)
  264. self.assertIsNone(operator.setitem(a, 0, 2))
  265. self.assertEqual(a, [2, 1, 2])
  266. self.assertRaises(IndexError, operator.setitem, a, 4, 2)
  267. def test_sub(self):
  268. operator = self.module
  269. self.assertRaises(TypeError, operator.sub)
  270. self.assertRaises(TypeError, operator.sub, None, None)
  271. self.assertEqual(operator.sub(5, 2), 3)
  272. def test_truth(self):
  273. operator = self.module
  274. class C(object):
  275. def __bool__(self):
  276. raise SyntaxError
  277. self.assertRaises(TypeError, operator.truth)
  278. self.assertRaises(SyntaxError, operator.truth, C())
  279. self.assertTrue(operator.truth(5))
  280. self.assertTrue(operator.truth([0]))
  281. self.assertFalse(operator.truth(0))
  282. self.assertFalse(operator.truth([]))
  283. def test_bitwise_xor(self):
  284. operator = self.module
  285. self.assertRaises(TypeError, operator.xor)
  286. self.assertRaises(TypeError, operator.xor, None, None)
  287. self.assertEqual(operator.xor(0xb, 0xc), 0x7)
  288. def test_is(self):
  289. operator = self.module
  290. a = b = 'xyzpdq'
  291. c = a[:3] + b[3:]
  292. self.assertRaises(TypeError, operator.is_)
  293. self.assertTrue(operator.is_(a, b))
  294. self.assertFalse(operator.is_(a,c))
  295. def test_is_not(self):
  296. operator = self.module
  297. a = b = 'xyzpdq'
  298. c = a[:3] + b[3:]
  299. self.assertRaises(TypeError, operator.is_not)
  300. self.assertFalse(operator.is_not(a, b))
  301. self.assertTrue(operator.is_not(a,c))
  302. def test_attrgetter(self):
  303. operator = self.module
  304. class A:
  305. pass
  306. a = A()
  307. a.name = 'arthur'
  308. f = operator.attrgetter('name')
  309. self.assertEqual(f(a), 'arthur')
  310. self.assertRaises(TypeError, f)
  311. self.assertRaises(TypeError, f, a, 'dent')
  312. self.assertRaises(TypeError, f, a, surname='dent')
  313. f = operator.attrgetter('rank')
  314. self.assertRaises(AttributeError, f, a)
  315. self.assertRaises(TypeError, operator.attrgetter, 2)
  316. self.assertRaises(TypeError, operator.attrgetter)
  317. # multiple gets
  318. record = A()
  319. record.x = 'X'
  320. record.y = 'Y'
  321. record.z = 'Z'
  322. self.assertEqual(operator.attrgetter('x','z','y')(record), ('X', 'Z', 'Y'))
  323. self.assertRaises(TypeError, operator.attrgetter, ('x', (), 'y'))
  324. class C(object):
  325. def __getattr__(self, name):
  326. raise SyntaxError
  327. self.assertRaises(SyntaxError, operator.attrgetter('foo'), C())
  328. # recursive gets
  329. a = A()
  330. a.name = 'arthur'
  331. a.child = A()
  332. a.child.name = 'thomas'
  333. f = operator.attrgetter('child.name')
  334. self.assertEqual(f(a), 'thomas')
  335. self.assertRaises(AttributeError, f, a.child)
  336. f = operator.attrgetter('name', 'child.name')
  337. self.assertEqual(f(a), ('arthur', 'thomas'))
  338. f = operator.attrgetter('name', 'child.name', 'child.child.name')
  339. self.assertRaises(AttributeError, f, a)
  340. f = operator.attrgetter('child.')
  341. self.assertRaises(AttributeError, f, a)
  342. f = operator.attrgetter('.child')
  343. self.assertRaises(AttributeError, f, a)
  344. a.child.child = A()
  345. a.child.child.name = 'johnson'
  346. f = operator.attrgetter('child.child.name')
  347. self.assertEqual(f(a), 'johnson')
  348. f = operator.attrgetter('name', 'child.name', 'child.child.name')
  349. self.assertEqual(f(a), ('arthur', 'thomas', 'johnson'))
  350. def test_itemgetter(self):
  351. operator = self.module
  352. a = 'ABCDE'
  353. f = operator.itemgetter(2)
  354. self.assertEqual(f(a), 'C')
  355. self.assertRaises(TypeError, f)
  356. self.assertRaises(TypeError, f, a, 3)
  357. self.assertRaises(TypeError, f, a, size=3)
  358. f = operator.itemgetter(10)
  359. self.assertRaises(IndexError, f, a)
  360. class C(object):
  361. def __getitem__(self, name):
  362. raise SyntaxError
  363. self.assertRaises(SyntaxError, operator.itemgetter(42), C())
  364. f = operator.itemgetter('name')
  365. self.assertRaises(TypeError, f, a)
  366. self.assertRaises(TypeError, operator.itemgetter)
  367. d = dict(key='val')
  368. f = operator.itemgetter('key')
  369. self.assertEqual(f(d), 'val')
  370. f = operator.itemgetter('nonkey')
  371. self.assertRaises(KeyError, f, d)
  372. # example used in the docs
  373. inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
  374. getcount = operator.itemgetter(1)
  375. self.assertEqual(list(map(getcount, inventory)), [3, 2, 5, 1])
  376. self.assertEqual(sorted(inventory, key=getcount),
  377. [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)])
  378. # multiple gets
  379. data = list(map(str, range(20)))
  380. self.assertEqual(operator.itemgetter(2,10,5)(data), ('2', '10', '5'))
  381. self.assertRaises(TypeError, operator.itemgetter(2, 'x', 5), data)
  382. # interesting indices
  383. t = tuple('abcde')
  384. self.assertEqual(operator.itemgetter(-1)(t), 'e')
  385. self.assertEqual(operator.itemgetter(slice(2, 4))(t), ('c', 'd'))
  386. # interesting sequences
  387. class T(tuple):
  388. 'Tuple subclass'
  389. pass
  390. self.assertEqual(operator.itemgetter(0)(T('abc')), 'a')
  391. self.assertEqual(operator.itemgetter(0)(['a', 'b', 'c']), 'a')
  392. self.assertEqual(operator.itemgetter(0)(range(100, 200)), 100)
  393. def test_methodcaller(self):
  394. operator = self.module
  395. self.assertRaises(TypeError, operator.methodcaller)
  396. self.assertRaises(TypeError, operator.methodcaller, 12)
  397. class A:
  398. def foo(self, *args, **kwds):
  399. return args[0] + args[1]
  400. def bar(self, f=42):
  401. return f
  402. def baz(*args, **kwds):
  403. return kwds['name'], kwds['self']
  404. a = A()
  405. f = operator.methodcaller('foo')
  406. self.assertRaises(IndexError, f, a)
  407. f = operator.methodcaller('foo', 1, 2)
  408. self.assertEqual(f(a), 3)
  409. self.assertRaises(TypeError, f)
  410. self.assertRaises(TypeError, f, a, 3)
  411. self.assertRaises(TypeError, f, a, spam=3)
  412. f = operator.methodcaller('bar')
  413. self.assertEqual(f(a), 42)
  414. self.assertRaises(TypeError, f, a, a)
  415. f = operator.methodcaller('bar', f=5)
  416. self.assertEqual(f(a), 5)
  417. f = operator.methodcaller('baz', name='spam', self='eggs')
  418. self.assertEqual(f(a), ('spam', 'eggs'))
  419. def test_inplace(self):
  420. operator = self.module
  421. class C(object):
  422. def __iadd__ (self, other): return "iadd"
  423. def __iand__ (self, other): return "iand"
  424. def __ifloordiv__(self, other): return "ifloordiv"
  425. def __ilshift__ (self, other): return "ilshift"
  426. def __imod__ (self, other): return "imod"
  427. def __imul__ (self, other): return "imul"
  428. def __imatmul__ (self, other): return "imatmul"
  429. def __ior__ (self, other): return "ior"
  430. def __ipow__ (self, other): return "ipow"
  431. def __irshift__ (self, other): return "irshift"
  432. def __isub__ (self, other): return "isub"
  433. def __itruediv__ (self, other): return "itruediv"
  434. def __ixor__ (self, other): return "ixor"
  435. def __getitem__(self, other): return 5 # so that C is a sequence
  436. c = C()
  437. self.assertEqual(operator.iadd (c, 5), "iadd")
  438. self.assertEqual(operator.iand (c, 5), "iand")
  439. self.assertEqual(operator.ifloordiv(c, 5), "ifloordiv")
  440. self.assertEqual(operator.ilshift (c, 5), "ilshift")
  441. self.assertEqual(operator.imod (c, 5), "imod")
  442. self.assertEqual(operator.imul (c, 5), "imul")
  443. self.assertEqual(operator.imatmul (c, 5), "imatmul")
  444. self.assertEqual(operator.ior (c, 5), "ior")
  445. self.assertEqual(operator.ipow (c, 5), "ipow")
  446. self.assertEqual(operator.irshift (c, 5), "irshift")
  447. self.assertEqual(operator.isub (c, 5), "isub")
  448. self.assertEqual(operator.itruediv (c, 5), "itruediv")
  449. self.assertEqual(operator.ixor (c, 5), "ixor")
  450. self.assertEqual(operator.iconcat (c, c), "iadd")
  451. def test_length_hint(self):
  452. operator = self.module
  453. class X(object):
  454. def __init__(self, value):
  455. self.value = value
  456. def __length_hint__(self):
  457. if type(self.value) is type:
  458. raise self.value
  459. else:
  460. return self.value
  461. self.assertEqual(operator.length_hint([], 2), 0)
  462. self.assertEqual(operator.length_hint(iter([1, 2, 3])), 3)
  463. self.assertEqual(operator.length_hint(X(2)), 2)
  464. self.assertEqual(operator.length_hint(X(NotImplemented), 4), 4)
  465. self.assertEqual(operator.length_hint(X(TypeError), 12), 12)
  466. with self.assertRaises(TypeError):
  467. operator.length_hint(X("abc"))
  468. with self.assertRaises(ValueError):
  469. operator.length_hint(X(-2))
  470. with self.assertRaises(LookupError):
  471. operator.length_hint(X(LookupError))
  472. def test_call(self):
  473. operator = self.module
  474. def func(*args, **kwargs): return args, kwargs
  475. self.assertEqual(operator.call(func), ((), {}))
  476. self.assertEqual(operator.call(func, 0, 1), ((0, 1), {}))
  477. self.assertEqual(operator.call(func, a=2, obj=3),
  478. ((), {"a": 2, "obj": 3}))
  479. self.assertEqual(operator.call(func, 0, 1, a=2, obj=3),
  480. ((0, 1), {"a": 2, "obj": 3}))
  481. def test_dunder_is_original(self):
  482. operator = self.module
  483. names = [name for name in dir(operator) if not name.startswith('_')]
  484. for name in names:
  485. orig = getattr(operator, name)
  486. dunder = getattr(operator, '__' + name.strip('_') + '__', None)
  487. if dunder:
  488. self.assertIs(dunder, orig)
  489. class PyOperatorTestCase(OperatorTestCase, unittest.TestCase):
  490. module = py_operator
  491. @unittest.skipUnless(c_operator, 'requires _operator')
  492. class COperatorTestCase(OperatorTestCase, unittest.TestCase):
  493. module = c_operator
  494. class OperatorPickleTestCase:
  495. def copy(self, obj, proto):
  496. with support.swap_item(sys.modules, 'operator', self.module):
  497. pickled = pickle.dumps(obj, proto)
  498. with support.swap_item(sys.modules, 'operator', self.module2):
  499. return pickle.loads(pickled)
  500. def test_attrgetter(self):
  501. attrgetter = self.module.attrgetter
  502. class A:
  503. pass
  504. a = A()
  505. a.x = 'X'
  506. a.y = 'Y'
  507. a.z = 'Z'
  508. a.t = A()
  509. a.t.u = A()
  510. a.t.u.v = 'V'
  511. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  512. with self.subTest(proto=proto):
  513. f = attrgetter('x')
  514. f2 = self.copy(f, proto)
  515. self.assertEqual(repr(f2), repr(f))
  516. self.assertEqual(f2(a), f(a))
  517. # multiple gets
  518. f = attrgetter('x', 'y', 'z')
  519. f2 = self.copy(f, proto)
  520. self.assertEqual(repr(f2), repr(f))
  521. self.assertEqual(f2(a), f(a))
  522. # recursive gets
  523. f = attrgetter('t.u.v')
  524. f2 = self.copy(f, proto)
  525. self.assertEqual(repr(f2), repr(f))
  526. self.assertEqual(f2(a), f(a))
  527. def test_itemgetter(self):
  528. itemgetter = self.module.itemgetter
  529. a = 'ABCDE'
  530. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  531. with self.subTest(proto=proto):
  532. f = itemgetter(2)
  533. f2 = self.copy(f, proto)
  534. self.assertEqual(repr(f2), repr(f))
  535. self.assertEqual(f2(a), f(a))
  536. # multiple gets
  537. f = itemgetter(2, 0, 4)
  538. f2 = self.copy(f, proto)
  539. self.assertEqual(repr(f2), repr(f))
  540. self.assertEqual(f2(a), f(a))
  541. def test_methodcaller(self):
  542. methodcaller = self.module.methodcaller
  543. class A:
  544. def foo(self, *args, **kwds):
  545. return args[0] + args[1]
  546. def bar(self, f=42):
  547. return f
  548. def baz(*args, **kwds):
  549. return kwds['name'], kwds['self']
  550. a = A()
  551. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  552. with self.subTest(proto=proto):
  553. f = methodcaller('bar')
  554. f2 = self.copy(f, proto)
  555. self.assertEqual(repr(f2), repr(f))
  556. self.assertEqual(f2(a), f(a))
  557. # positional args
  558. f = methodcaller('foo', 1, 2)
  559. f2 = self.copy(f, proto)
  560. self.assertEqual(repr(f2), repr(f))
  561. self.assertEqual(f2(a), f(a))
  562. # keyword args
  563. f = methodcaller('bar', f=5)
  564. f2 = self.copy(f, proto)
  565. self.assertEqual(repr(f2), repr(f))
  566. self.assertEqual(f2(a), f(a))
  567. f = methodcaller('baz', self='eggs', name='spam')
  568. f2 = self.copy(f, proto)
  569. # Can't test repr consistently with multiple keyword args
  570. self.assertEqual(f2(a), f(a))
  571. class PyPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
  572. module = py_operator
  573. module2 = py_operator
  574. @unittest.skipUnless(c_operator, 'requires _operator')
  575. class PyCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
  576. module = py_operator
  577. module2 = c_operator
  578. @unittest.skipUnless(c_operator, 'requires _operator')
  579. class CPyOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
  580. module = c_operator
  581. module2 = py_operator
  582. @unittest.skipUnless(c_operator, 'requires _operator')
  583. class CCOperatorPickleTestCase(OperatorPickleTestCase, unittest.TestCase):
  584. module = c_operator
  585. module2 = c_operator
  586. if __name__ == "__main__":
  587. unittest.main()