Skip to main content

Clojure-like utilities

Project description

clj

clj is a Python module for those times when you did too much Clojure and came back to Python thinking where are all these distinct, drop-while, cycle, first, etc.

Install

pip install clj

Usage

Example

;; Clojure
(println (count (distinct (filter even? (map inc coll)))))
# Python
from clj import count, distinct, filter, inc, map

even = lambda e: ~e&1

print(count(distinct(filter(even, map(inc, coll)))))

Note that count() works on both sequences in generators; in the latter case it doesn’t load everything in memory like e.g. len(list(g)) would do.

Core Ideas

  • Lazy by default. All functions should work on arbitrary iterators and return generators.
  • This is Python. We keep Python’s semantics instead of trying to reproduce Clojure in Python (e.g. 0 and [] are logically true in Clojure but false in Python; None is not equivalent to an empty collection).
  • Don’t Reinvent the Wheel. We don’t reimplement built-in functions unless they miss something: range because it can’t be called without argument to yield an infinite sequence; map and filter in Python 2 because they aren’t lazy.

Support

The general naming scheme is: use underscores instead of hyphens; start the function with is_ if its Clojure counterparts ends with a ?.

Sequences

We aim to implement all Clojure functions that operate on sequences (see the list here). They all work on iterables and return generators by default (Python’s closest equivalent of lazy seqs). We don’t support transducers.

Clojure clj Comment
distinct distinct
filter filter
remove remove
keep keep
keep-indexed keep_indexed 
cons cons
concat concat Deprecated. Use Python’s itertools.chain
lazy-cat - Use Python’s itertools.chain
mapcat mapcat
cycle cycle
interleave interleave
interpose interpose
rest rest
next - Use rest.
fnext - Use second.
nnext - Use rest(rest(…))
drop drop
drop-while drop_while Deprecated. Use Python’s itertools.dropwhile
nthnext - Use drop.
take take
take-nth take_nth
take-while take_while Deprecated. Use Python’s itertools.takewhile
butlast butlast
drop-last drop_last
flatten flatten
reverse - Use Python’s reversed.
sort - Use Python’s built-in sort.
sort-by - Use sort(…, key=your_function).
shuffle shuffle
split-at split_at
split-with split_with
partition  
partition-all  
partition-by  
map map
pmap -
replace replace
reductions reductions (reductions f i c) becomes reductions(f, c, i)
map-indexed map_indexed
seque -
first first 
ffirst ffirst
nfirst nfirst
second second
nth nth
last last
rand-nth - Use Python’s random.choice.
zipmap zipmap
into -
reduce - Use Python’s built-in reduce.
set - Use Python’s set.
vec - Use Python’s list.
into-array - Use Python’s list.
to-array-2d -
frequencies - Use Python’s collections.Counter.
group-by group_by
apply - Use the f(*args) construct.
not-empty -
some some
seq? is_seq
every? every
not-every? not_every
not-any? not_any
empty? -
empty empty
doseq - Use for … in.
dorun dorun
doall - Use Python’s list.
realized? -
seq -
vals - Use Python’s dict.values.
keys - Use Python’s dict.keys.
rseq -
subseq  
rsubseq  
repeatedly repeatedly
iterate iterate
repeat repeat (repeat n x) becomes repeat(x, n).
range range Prefer Python’s range for everything but infinite generators.
line-seq - Loop over an io.BufferedReader.
resultset-seq -
re-seq - Use Python’s re.finditer.
tree-seq tree_seq
file-seq - Use Python’s os.walk.
xml-seq -
iterator-seq -
enumeration-seq -
hash-map - Use Python’s dict.
array-map - Use Python’s dict.
sorted-map - Use collections.OrderedDict.
sorted-map-by
hash-set - Use Python’s set.
set - Use Python’s set.
sorted-set
sorted-set-by
dedupe

We also implemented count, which uses Python’s len when possible and fallbacks on a for loop for other cases.

Functions

We also provide miscellaneous functions as well as functions that work on functions.

Clojure clj Comment
identity identity
partial - Use Python’s functools.partial
comp comp
complement complement
constantly constantly
juxt juxt
distinct? is_distinct
Clojure clj Comment
inc inc
dec dec

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clj-0.1.3.tar.gz (13.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clj-0.1.3-py3-none-any.whl (10.3 kB view details)

Uploaded Python 3

File details

Details for the file clj-0.1.3.tar.gz.

File metadata

  • Download URL: clj-0.1.3.tar.gz
  • Upload date:
  • Size: 13.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.3

File hashes

Hashes for clj-0.1.3.tar.gz
Algorithm Hash digest
SHA256 c333a36878637daf1694dab44b8af53d0fbbd7f1984677124b4d0b2b65b4fb61
MD5 2f8a1c0ecc702624f073baf014c5065b
BLAKE2b-256 f88e4e6d94d687c67949f4ad1969081177afad994fba98020c1aa50b2abf981a

See more details on using hashes here.

File details

Details for the file clj-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: clj-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 10.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.29.1 CPython/3.7.3

File hashes

Hashes for clj-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d8cddc2e96bfd0d7233a43974b1e01ce15d99152743fdcf9469e6c79e0b32164
MD5 bbeb084a6eaf16fa7a66745f323d6691
BLAKE2b-256 81b4653aacd09f99ba819a811dc822b735bc9525278f0c5f25dc69bc45e41401

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page