@@ -113,8 +113,8 @@ def __init__(self, left, right=None, op=None):
113
113
Do not use this directly, use `cycler` function instead.
114
114
"""
115
115
self ._keys = _process_keys (left , right )
116
- self ._left = copy .copy (left )
117
- self ._right = copy .copy (right )
116
+ self ._left = copy .deepcopy (left )
117
+ self ._right = copy .deepcopy (right )
118
118
self ._op = op
119
119
120
120
@property
@@ -228,11 +228,11 @@ def __iadd__(self, other):
228
228
other : Cycler
229
229
The second Cycler
230
230
"""
231
- old_self = copy .copy (self )
231
+ old_self = copy .deepcopy (self )
232
232
self ._keys = _process_keys (old_self , other )
233
233
self ._left = old_self
234
234
self ._op = zip
235
- self ._right = copy .copy (other )
235
+ self ._right = copy .deepcopy (other )
236
236
return self
237
237
238
238
def __imul__ (self , other ):
@@ -245,11 +245,11 @@ def __imul__(self, other):
245
245
The second Cycler
246
246
"""
247
247
248
- old_self = copy .copy (self )
248
+ old_self = copy .deepcopy (self )
249
249
self ._keys = _process_keys (old_self , other )
250
250
self ._left = old_self
251
251
self ._op = product
252
- self ._right = copy .copy (other )
252
+ self ._right = copy .deepcopy (other )
253
253
return self
254
254
255
255
def __eq__ (self , other ):
@@ -334,24 +334,32 @@ def simplify(self):
334
334
335
335
def cycler (* args , ** kwargs ):
336
336
"""
337
- Create a new `Cycler` object from the combination of
338
- positional arguments or keyword arguments.
337
+ Create a new `Cycler` object from a single positional argument,
338
+ a pair of positional arguments, or the combination of keyword arguments.
339
339
340
340
cycler(arg)
341
341
cycler(label1=itr1[, label2=iter2[, ...]])
342
342
cycler(label, itr)
343
343
344
344
Form 1 simply copies a given `Cycler` object.
345
+
345
346
Form 2 composes a `Cycler` as an inner product of the
346
- pairs of keyword arguments.
347
+ pairs of keyword arguments. In other words, all of the
348
+ iterables are cycled simultaneously, as if through zip().
349
+
347
350
Form 3 creates a `Cycler` from a label and an iterable.
348
- This is useful for when the label cannot be a keyword argument.
351
+ This is useful for when the label cannot be a keyword argument
352
+ (e.g., an integer or a name that has a space in it).
349
353
350
354
Parameters
351
355
----------
356
+ arg : Cycler
357
+ Copy constructor for Cycler.
358
+
352
359
label : name
353
360
The property key. In the 2-arg form of the function,
354
- the label can be any hashable object.
361
+ the label can be any hashable object. In the keyword argument
362
+ form of the function, it must be a valid python identifier.
355
363
356
364
itr : iterable
357
365
Finite length iterable of the property values.
@@ -370,7 +378,7 @@ def cycler(*args, **kwargs):
370
378
if not isinstance (args [0 ], Cycler ):
371
379
raise TypeError ("If only one positional argument given, it must "
372
380
" be a Cycler instance." )
373
- return copy .copy (args [0 ])
381
+ return copy .deepcopy (args [0 ])
374
382
elif len (args ) == 2 :
375
383
return _cycler (* args )
376
384
elif len (args ) > 2 :
@@ -390,7 +398,7 @@ def _cycler(label, itr):
390
398
391
399
Parameters
392
400
----------
393
- label : str
401
+ label : hashable
394
402
The property key.
395
403
396
404
itr : iterable
@@ -408,7 +416,7 @@ def _cycler(label, itr):
408
416
raise ValueError (msg )
409
417
410
418
if label in keys :
411
- return copy .copy (itr )
419
+ return copy .deepcopy (itr )
412
420
else :
413
421
lab = keys .pop ()
414
422
itr = list (v [lab ] for v in itr )
0 commit comments