skip to navigation
skip to content

Not Logged In

funcy 0.2.1

A fancy functional tools.

Latest Version: 0.10.1

A collection of fancy functional tools. Manipulate your functions and data with ease.

Inspired by my own abstractions and clojure standard library.

Installation

pip install funcy

Overview

Just import stuff from funcy to make things happen:

from funcy import * # or whatever you need

Merge collections of same type (works for dicts, sets, lists, tuples, iterators and even strings):

merge(coll1, coll2, coll3, ...)
join(colls)

Walk through collection, creating it's transform (like map but preserves type):

walk(str.upper, {'a', 'b'})            # {'A', 'B'}
walk(reversed, {'a': 1, 'b': 2})       # {1: 'a', 2: 'b'}
walk_keys(double, {'a': 1, 'b': 2})    # {'aa': 1, 'bb': 2}
walk_values(inc, {'a': 1, 'b': 2})     # {'a': 2, 'b': 3}

Select a part of collection:

select(even, {1,2,3,10,20})                  # {2,10,20}
select(re_tester('^a'), ('a','b','ab','ba')) # ('a','ab')
select_keys(callable, {str: '', None: None}) # {str: ''}

Test collection contents:

all(callable, [abs, open, int]) # True
all(even, [1, 2, 5])            # False
any(even, [1, 2, 5])            # True
none(even, [1, 2, 5])           # False

Or search for something:

some(even, [1, 2, 5])      # 2
some([0, '', -1, None, 2]) # -1

More tools for mappings:

flip({'a': 1, 'b': 2})                        # {1: 'a', 2: 'b'}
project({'a': 1, 'b': 2, 'c': 3}, ['a', 'c']) # {'a': 1, 'c': 3}

Manipulate functions:

partial(add, 1)                # inc
curry(add)(1)(2)               # 3
compose(inc, double)(10)       # 21
complement(even)               # odd
map(iffy(len), ['ab',None,'c'] # [2,None,1]
iffy(callable, caller())(val)  # val() if callable(val) else val

Easy decorators:

@decorator
def log(call):
    print call.func.__name__, call.args
    return call()

Work with sequences:

take(4, iterate(double, 1)) # [1, 2, 4, 8]
first(drop(3, count(10)))   # 13

remove(even, [1, 2, 3])     # [1, 3]
concat([1, 2], [5, 6])      # [1, 2, 5, 6]
cat(map(range, range(4)))   # [0, 0, 1, 0, 1, 2]
mapcat(range, range(4)))    # same
distinct('abacbdd')         # list('abcd')

split(2, range(5))          # [[0, 1], [2, 3, 4]]
split(odd, range(5))        # [[1, 3], [0, 2, 4]]
groupby(mod2, range(5))     # {0: [0, 2, 4], 1: [1, 3]}

partition(2, range(5))      # [[0, 1], [2, 3]]
chunks(2, range(5))         # [[0, 1], [2, 3], [4]]
partition(2, 1, range(4))   # [[0, 1], [1, 2], [2, 3]]
chunks(2, 1, range(4))      # [[0, 1], [1, 2], [2, 3], [3]]

And many more, see tests and source.

How you can help

Bring your ideas and/or code that can make functional python more fun.

TODO

  • create cheatsheet html
  • write docs
  • vector chained boolean test (like perl 6 [<])
  • lazy, lazy_seq, lazy_dict
  • make better or get rid of generator version of @decorator
  • reject*(), split collections
 
File Type Py Version Uploaded on Size
funcy-0.2.1.tar.gz (md5) Source 2012-12-18 8KB
  • Downloads (All Versions):
  • 109 downloads in the last day
  • 525 downloads in the last week
  • 2935 downloads in the last month