Skip to content
/ pysj Public

Pysj makes Python development more comfortable. This package contains utils, classes and helper functions I find myself reimplementing in several projects.

License

Notifications You must be signed in to change notification settings

sondreod/pysj

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

102 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pysj

This package contains utils, classes and helper functions I find myself reimplementing in several projects. As of now all functions are importable from the top level module.

The name is a commonly used shortened version of the Norwegian word "pysjamas" (in english: pajamas/pyjamas). Coding in your pysjamas/pajamas/pyjamas is comfortable. This package is an attempt to make Python development a bit more comfortable as well.

This is an ongoing project and so far just a few functions are implemented. Most time have been spent on project structure, tests and packaging.

Installation

pip install pysj

Usage

Importing

# We import everything here for all of the examples
from pysj import (
    md5, 
    sha256,
    ExtendedJSONDecoder,
    ExtendedJSONEncoder,
    Timer,
    chunk,
    first,
    flatten,
    isotime,
    moving_average,
    n_wise,
    paginate,
    seconds,
    take,
    transpose
)

Extended JSON encoding / decoding

# Serializing to json with datetime objects
json.dumps(
    {
        "timestamp": datetime.datetime.fromisoformat("2021-12-01T04:50:00.123456")
    },
    cls=ExtendedJSONEncoder,
)

# and back again
json.loads('{"timestamp": "2021-12-01T04:50:00"}',
    cls=ExtendedJSONDecoder,
)

Some functional stuff

Flatten

Flattens an iterable, depth first.

>>> flatten([range(10), (1,2,3), "HELLO", [[["42"]], []], ["y0l0"]])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 'HELLO', '42', 'y0l0']

First

Get first element of an iterable

>>> first([1, 2, 3])
1

Take

Get first n elements from an iterable

data = range(100)
>>> list(take(4, ))
[0, 1, 2, 3]

Chunk

Chunks an iterable into an iterable yield a list with n items at a time.

Takes an optional fillvalue, defaults to None,

data = range(10)
>>> list(chunk(take(4, data, fillvalue=":D")))
[
    [0, 1, 2, 3],
    [4, 5, 6, 7],
    [9, 10, ":D", ":D"],
]

Transpose

>>> transpose(
    [
        [1,2,3],
        [1,2,3],
        [1,2,3],
    ]
)
[
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3]
]

N wise

Yields n items from data like a gliding window, as long as there is enough elements in data to yield the full window.

Like itertools.pairwise, but generalized to n items. (New in Python 3.10)

>>> list(n_wise(3, [1,2,3,4,5]))
[(1,2,3), (2,3,4), (3,4,5)]

Moving average

>>> list(moving_average(3, (1,2,3,4,5)))
[2.0, 3.0, 4.0]

Other

Isotime

Returns an isoformated string of the current time (or supplied datetime dt) to the given precision, defaults to 'd' (day).

>>>isotime()
'2023-01-01'

>>>isotime('s')
'2023-01-01T00:00:00'

>>>isotime('m', datetime(2022, 2, 2, 2, 2))
'2022-02-02T02:02'

# Only the first character of *precision* is used, so for readability you can write it out fully.
>>>isotime('minutes', datetime(2022, 2, 2, 2, 2))
'2022-02-02T02:02'

Stopwatch

>>> with Timer():
>>>     # Do stuff
>>>     sleep(1)
Starting timer
Elapsed time 1.0007134879997466 s.

Simple hashing

>>> print(sha256("test"))
9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
>>> print(md5("test"))
098f6bcd4621d373cade4e832627b4f6

About

Pysj makes Python development more comfortable. This package contains utils, classes and helper functions I find myself reimplementing in several projects.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published