Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Suor/funcy
A fancy and practical functional tools
https://github.com/Suor/funcy
functional-programming python utilities
Last synced: 9 days ago
JSON representation
A fancy and practical functional tools
- Host: GitHub
- URL: https://github.com/Suor/funcy
- Owner: Suor
- License: bsd-3-clause
- Created: 2012-10-13T00:44:57.000Z (about 12 years ago)
- Default Branch: master
- Last Pushed: 2024-05-01T10:07:23.000Z (6 months ago)
- Last Synced: 2024-05-21T01:03:59.338Z (6 months ago)
- Topics: functional-programming, python, utilities
- Language: Python
- Homepage:
- Size: 1.04 MB
- Stars: 3,283
- Watchers: 71
- Forks: 141
- Open Issues: 13
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGELOG
- License: LICENSE
Awesome Lists containing this project
- my-awesome-starred - funcy - A fancy and practical functional tools (Python)
- best-of-python - GitHub - 11% open · ⏱️ 01.05.2024): (General Utilities)
- awesome-python-resources - GitHub - 7% open · ⏱️ 25.08.2022): (函数式编程)
- awesome-list - Funcy - A collection of fancy functional tools focused on practicality. (Containers & Language Extentions & Linting / For Python)
- starred-awesome - funcy - A fancy and practical functional tools (Python)
README
Funcy |Build Status|
=====A collection of fancy functional tools focused on practicality.
Inspired by clojure, underscore and my own abstractions. Keep reading to get an overview
or `read the docs `_.
Or jump directly to `cheatsheet `_.Works with Python 3.4+ and pypy3.
Installation
-------------::
pip install funcy
Overview
--------------Import stuff from funcy to make things happen:
.. code:: python
from funcy import whatever, you, need
Merge collections of same type
(works for dicts, sets, lists, tuples, iterators and even strings):.. code:: python
merge(coll1, coll2, coll3, ...)
join(colls)
merge_with(sum, dict1, dict2, ...)Walk through collection, creating its transform (like map but preserves type):
.. code:: python
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:
.. code:: python
select(even, {1,2,3,10,20}) # {2,10,20}
select(r'^a', ('a','b','ab','ba')) # ('a','ab')
select_keys(callable, {str: '', None: None}) # {str: ''}
compact({2, None, 1, 0}) # {1,2}Manipulate sequences:
.. code:: python
take(4, iterate(double, 1)) # [1, 2, 4, 8]
first(drop(3, count(10))) # 13lremove(even, [1, 2, 3]) # [1, 3]
lconcat([1, 2], [5, 6]) # [1, 2, 5, 6]
lcat(map(range, range(4))) # [0, 0, 1, 0, 1, 2]
lmapcat(range, range(4)) # same
flatten(nested_structure) # flat iter
distinct('abacbdd') # iter('abcd')lsplit(odd, range(5)) # ([1, 3], [0, 2, 4])
lsplit_at(2, range(5)) # ([0, 1], [2, 3, 4])
group_by(mod3, range(5)) # {0: [0, 3], 1: [1, 4], 2: [2]}lpartition(2, range(5)) # [[0, 1], [2, 3]]
chunks(2, range(5)) # iter: [0, 1], [2, 3], [4]
pairwise(range(5)) # iter: [0, 1], [1, 2], ...And functions:
.. code:: python
partial(add, 1) # inc
curry(add)(1)(2) # 3
compose(inc, double)(10) # 21
complement(even) # odd
all_fn(isa(int), even) # is_even_intone_third = rpartial(operator.div, 3.0)
has_suffix = rcurry(str.endswith, 2)Create decorators easily:
.. code:: python
@decorator
def log(call):
print(call._func.__name__, call._args)
return call()Abstract control flow:
.. code:: python
walk_values(silent(int), {'a': '1', 'b': 'no'})
# => {'a': 1, 'b': None}@once
def initialize():
"..."with suppress(OSError):
os.remove('some.file')@ignore(ErrorRateExceeded)
@limit_error_rate(fails=5, timeout=60)
@retry(tries=2, errors=(HttpError, ServiceDown))
def some_unreliable_action(...):
"..."class MyUser(AbstractBaseUser):
@cached_property
def public_phones(self):
return self.phones.filter(public=True)Ease debugging:
.. code:: python
squares = {tap(x, 'x'): tap(x * x, 'x^2') for x in [3, 4]}
# x: 3
# x^2: 9
# ...@print_exits
def some_func(...):
"..."@log_calls(log.info, errors=False)
@log_errors(log.exception)
def some_suspicious_function(...):
"..."with print_durations('Creating models'):
Model.objects.create(...)
# ...
# 10.2 ms in Creating modelsAnd `much more `_.
Dive in
-------Funcy is an embodiment of ideas I explain in several essays:
- `Why Every Language Needs Its Underscore `_
- `Functional Python Made Easy `_
- `Abstracting Control Flow `_
- `Painless Decorators `_Related Projects
----------------- https://pypi.org/project/funcy-chain/
- https://pypi.org/project/funcy-pipe/Running tests
--------------To run the tests using your default python:
::
pip install -r test_requirements.txt
py.testTo fully run ``tox`` you need all the supported pythons to be installed. These are
3.4+ and PyPy3. You can run it for particular environment even in absense
of all of the above::tox -e py310
tox -e pypy3
tox -e lint.. |Build Status| image:: https://github.com/Suor/funcy/actions/workflows/test.yml/badge.svg
:target: https://github.com/Suor/funcy/actions/workflows/test.yml?query=branch%3Amaster