Skip to content

Commit 0e15d06

Browse files
committed
Bring back the 2-arg form of cycler() and __repr__
1 parent 62a29f2 commit 0e15d06

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

cycler.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ def __getitem__(self, key):
164164
# TODO : maybe add numpy style fancy slicing
165165
if isinstance(key, slice):
166166
trans = self._transpose()
167-
return cycler(**dict((k, v[key])
168-
for k, v in six.iteritems(trans)))
167+
return reduce(add, (_cycler(k, v[key])
168+
for k, v in six.iteritems(trans)))
169169
else:
170170
raise ValueError("Can only use slices with Cycler.__getitem__")
171171

@@ -203,8 +203,8 @@ def __mul__(self, other):
203203
return Cycler(self, other, product)
204204
elif isinstance(other, int):
205205
trans = self._transpose()
206-
return cycler(**dict((k, v*other)
207-
for k, v in six.iteritems(trans)))
206+
return reduce(add, (_cycler(k, v*other)
207+
for k, v in six.iteritems(trans)))
208208
else:
209209
return NotImplemented
210210

@@ -268,7 +268,7 @@ def __repr__(self):
268268
if self._right is None:
269269
lab = self.keys.pop()
270270
itr = list(v[lab] for v in self)
271-
return "cycler({lab}={itr!r})".format(lab=lab, itr=itr)
271+
return "cycler({lab!r}, {itr!r})".format(lab=lab, itr=itr)
272272
else:
273273
op = op_map.get(self._op, '?')
274274
msg = "({left!r} {op} {right!r})"
@@ -329,7 +329,7 @@ def simplify(self):
329329
# I would believe that there is some performance implications
330330

331331
trans = self._transpose()
332-
return cycler(**dict((k, v) for k, v in six.iteritems(trans)))
332+
return reduce(add, (_cycler(k, v) for k, v in six.iteritems(trans)))
333333

334334

335335
def cycler(*args, **kwargs):
@@ -339,15 +339,19 @@ def cycler(*args, **kwargs):
339339
340340
cycler(arg)
341341
cycler(label1=itr1[, label2=iter2[, ...]])
342+
cycler(label, itr)
342343
343344
Form 1 simply copies a given `Cycler` object.
344345
Form 2 composes a `Cycler` as an inner product of the
345346
pairs of keyword arguments.
347+
Form 3 creates a `Cycler` from a label and an iterable.
348+
This is useful for when the label cannot be a keyword argument.
346349
347350
Parameters
348351
----------
349-
label : str
350-
The property key.
352+
label : name
353+
The property key. In the 2-arg form of the function,
354+
the label can be any hashable object.
351355
352356
itr : iterable
353357
Finite length iterable of the property values.
@@ -367,7 +371,9 @@ def cycler(*args, **kwargs):
367371
raise TypeError("If only one positional argument given, it must "
368372
" be a Cycler instance.")
369373
return copy.copy(args[0])
370-
elif len(args) > 1:
374+
elif len(args) == 2:
375+
return _cycler(*args)
376+
elif len(args) > 2:
371377
raise TypeError("Only a single Cycler can be accepted as the lone "
372378
"positional argument. Use keyword arguments instead.")
373379

test_cycler.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ def test_constructor():
7474
yield _cycler_helper, c1+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2
7575
c3 = cycler(c=c1)
7676
yield _cycler_helper, c3+c2, 3, ['c', 'ec'], [['r', 'g', 'b']]*2
77+
# Using a non-string hashable
78+
c4 = cycler(1, range(3))
79+
yield _cycler_helper, c4+c1, 3, [1, 'c'], [range(3), ['r', 'g', 'b']]
7780

7881
# addition using cycler()
7982
yield (_cycler_helper, cycler(c='rgb', lw=range(3)),
@@ -123,13 +126,13 @@ def test_mul_fails():
123126

124127

125128
def test_getitem():
126-
c1 = cycler(lw=range(15))
129+
c1 = cycler(3, range(15))
127130
widths = list(range(15))
128131
for slc in (slice(None, None, None),
129132
slice(None, None, -1),
130133
slice(1, 5, None),
131134
slice(0, 5, 2)):
132-
yield _cycles_equal, c1[slc], cycler(lw=widths[slc])
135+
yield _cycles_equal, c1[slc], cycler(3, widths[slc])
133136

134137

135138
def test_fail_getime():
@@ -147,16 +150,17 @@ def _repr_tester_helper(rpr_func, cyc, target_repr):
147150

148151
def test_repr():
149152
c = cycler(c='rgb')
150-
c2 = cycler(lw=range(3))
153+
# Using an identifier that would be not valid as a kwarg
154+
c2 = cycler('3rd', range(3))
151155

152-
c_sum_rpr = "(cycler(c=['r', 'g', 'b']) + cycler(lw=[0, 1, 2]))"
153-
c_prod_rpr = "(cycler(c=['r', 'g', 'b']) * cycler(lw=[0, 1, 2]))"
156+
c_sum_rpr = "(cycler('c', ['r', 'g', 'b']) + cycler('3rd', [0, 1, 2]))"
157+
c_prod_rpr = "(cycler('c', ['r', 'g', 'b']) * cycler('3rd', [0, 1, 2]))"
154158

155159
yield _repr_tester_helper, '__repr__', c + c2, c_sum_rpr
156160
yield _repr_tester_helper, '__repr__', c * c2, c_prod_rpr
157161

158-
sum_html = "<table><th>'c'</th><th>'lw'</th><tr><td>'r'</td><td>0</td></tr><tr><td>'g'</td><td>1</td></tr><tr><td>'b'</td><td>2</td></tr></table>"
159-
prod_html = "<table><th>'c'</th><th>'lw'</th><tr><td>'r'</td><td>0</td></tr><tr><td>'r'</td><td>1</td></tr><tr><td>'r'</td><td>2</td></tr><tr><td>'g'</td><td>0</td></tr><tr><td>'g'</td><td>1</td></tr><tr><td>'g'</td><td>2</td></tr><tr><td>'b'</td><td>0</td></tr><tr><td>'b'</td><td>1</td></tr><tr><td>'b'</td><td>2</td></tr></table>"
162+
sum_html = "<table><th>'3rd'</th><th>'c'</th><tr><td>0</td><td>'r'</td></tr><tr><td>1</td><td>'g'</td></tr><tr><td>2</td><td>'b'</td></tr></table>"
163+
prod_html = "<table><th>'3rd'</th><th>'c'</th><tr><td>0</td><td>'r'</td></tr><tr><td>1</td><td>'r'</td></tr><tr><td>2</td><td>'r'</td></tr><tr><td>0</td><td>'g'</td></tr><tr><td>1</td><td>'g'</td></tr><tr><td>2</td><td>'g'</td></tr><tr><td>0</td><td>'b'</td></tr><tr><td>1</td><td>'b'</td></tr><tr><td>2</td><td>'b'</td></tr></table>"
160164

161165
yield _repr_tester_helper, '_repr_html_', c + c2, sum_html
162166
yield _repr_tester_helper, '_repr_html_', c * c2, prod_html

0 commit comments

Comments
 (0)