unipy.utils.generator module

Docstring for generator.

Versatile Generators

Productivity

ReusableGenerator

Reusable Generator.

re_generator

Functional API for ReusableGenerator.

Lazy Evaluation

split_generator

Split data by given size.

Range Generator

num_fromto_generator

Range number string pairs by given term.

dt_fromto_generator

Range date format string pairs by given term.

tm_fromto_generator

Range datetime format string pairs by given term.

timestamp_generator

Range timestamp string pairs by given term.

class unipy.utils.generator.ReusableGenerator(generator)[source]

Bases: object

Temporary Interface to re-use generator for convenience.

Once assigned, It can be infinitely consumed **as long as an input generator remains un-exhausted.

_source

A source generator.

Type

generator

See also

generator itertools.tee

Examples

>>> from unipy.utils.generator import ReusableGenerator
>>> gen = (i for i in range(10))
>>> gen
<generator object <genexpr> at 0x11120ebf8>
>>> regen = ReusableGenerator(gen)
>>> regen
<unipy.utils.generator.ReusableGenerator object at 0x1061a97f0>
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(gen)  # If the source is used, copied one will be exhausted too.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(gen)
[]
>>> list(regen)
[]
unipy.utils.generator.re_generator(generator)[source]

A functional API for unipy.ReusableGenerator.

Once assigned, It can be infinitely consumed **as long as an output generator is called at least one time.

Parameters

generator (generator) – An generator to copy. This original generator should not be used anywhere else, until the copied one consumed at least once.

Returns

A generator to be used infinitely.

Return type

generator

See also

generator itertools.tee

Examples

>>> from unipy.utils.generator import re_generator
>>> gen = (i for i in range(10))
>>> gen
<generator object <genexpr> at 0x11120ebf8>
>>> regen = copy_generator(gen)
>>> regen
<unipy.utils.generator.ReusableGenerator object at 0x1061a97f0>
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(gen)  # Once the copied one is used, the source will be exhausted.
[]
>>> list(gen)
[]
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(regen)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
unipy.utils.generator.split_generator(iterable, size)[source]
unipy.utils.generator.num_fromto_generator(start, end, term)[source]

A range function yields pair chunks.

It had made for time-formatting query. It yields a tuple of (start, start+(term-1)) pair, until start > end.

Parameters

*args (int) – end or start, end[, term] It works like range function.

Yields

tuple – A tuple of (start, start+(term-1)) pair, until start > end.

See also

yield

Examples

>>> from unipy.utils.generator import num_fromto_generator
>>>
>>> query = 'BETWEEN {pre} AND {nxt};'
>>>
>>> q_list = [query.format(pre=item[0], nxt=item[1])
...           for item in num_fromto_generator(1, 100, 10)]
>>> print(q_list[0])
BETWEEN 1 AND 10;
>>> print(q_list[1])
BETWEEN 11 AND 20;
unipy.utils.generator.dt_fromto_generator(start, end, day_term, tm_format='%Y%m%d')[source]

A range function yields datetime formats by pair.

It had made for time-formatting query. It yields a tuple of (start, start+(term-1)) pair, until start > end.

Parameters
  • start (str) – start datetime like ‘yyyymmdd’.

  • end (str) – start datetime like ‘yyyymmdd’.

  • day_term (int) – term of days.

  • tm_format ((default: '%Y%m%d')) – datetime format string.

Yields

tuple – A tuple of (start, start+(term-1)) pair, until start > end.

See also

yield

Examples

>>> from unipy.utils.generator import dt_fromto_generator
>>> dt_list = [item for item in
...            dt_fromto_generator('20170101','20170331', 10)]
>>> dt_list[:3]
[('20170101', '20170110'),
 ('20170111', '20170120'),
 ('20170121', '20170130')]
unipy.utils.generator.tm_fromto_generator(start, end, day_term, tm_string=['000000', '235959'], tm_format='%Y%m%d')[source]

A range function yields datetime formats by pair.

It had made for time-formatting query. It yields a tuple of (start, start+(term-1)) pair, until start > end.

Parameters
  • start (str) – start datetime like ‘yyyymmdd’.

  • end (str) – start datetime like ‘yyyymmdd’.

  • day_term (int) – term of days.

  • tm_string (list (default: ['000000', '235959'])) – time strings to concatenate.

  • tm_format ((default: '%Y%m%d')) – datetime format string.

Yields

tuple – A tuple of (start, start+(term-1)) pair, until start > end.

See also

yield

Examples

>>> from unipy.utils.generator import tm_fromto_generator
>>> tm_list = [item for item in
...            tm_fromto_generator('20170101','20170331', 10)]
>>> tm_list[:3]
[('20170101000000', '20170110235959'),
 ('20170111000000', '20170120235959'),
 ('20170121000000', '20170130235959')]
unipy.utils.generator.timestamp_generator(*args)[source]

A range function yields pair timestep strings.

It had made for time-formatting query. It yields a tuple of (start, start+(term-1)) pair, until start > end.

Parameters

*args (int) – end or start, end[, term] It works like range function.

Yields

tuple – A tuple of (start, start+(term-1)) pair, until start > end.

See also

yield

Examples

>>> from unipy.utils.generator import timestamp_generator
>>> timestamp_generator(1, 10, 2)
<generator object timestamp_generator at 0x10f519678>
>>> list(timestamp_generator(1, 14, 5))
[(1, 5), (6, 10), (11, 15)]
>>> begin, fin, period = 1, 10, 3
>>> list(timestamp_generator(begin, fin, period))
[(1, 3), (4, 6), (7, 9), (10, 12)]
>>> time_sequence = timestamp_generator(begin, fin, period)
>>> time_msg = "{start:2} to {end:2}, {term:2} days."
>>> for time in time_sequence:
... b, f = time
... print(time_msg.format(start=b, end=f, term=period))
...
 1 to  3,  3 days.
 4 to  6,  3 days.
 7 to  9,  3 days.
10 to 12,  3 days.