GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

Suor

funcy – ファンシーで実用的な機能ツール

投稿日:

ファンシーで実用的な機能ツール

Funcy

実用性に焦点を当てた派手な機能ツールの集まり。

クロージャー、アンダースコア、そして私自身の抽象にインスパイアされています。 概要を得るために読んだままにするか、ドキュメントを読んでください または、直接チートシートにジャンプします

Python 2.6+、3.3+、pypyで動作します。

インストール

pip install funcy

概要

物事を起こすためにfuncyからものをインポートする:

from funcy import whatever, you, need

同じタイプのコレクションをマージします(dicts、セット、リスト、タプル、イテレータ、および文字列でも機能します):

merge(coll1, coll2, coll3, ...)
join(colls)
merge_with(sum, dict1, dict2, ...)

コレクションを歩いて、その変形を作成します(マップのようにタイプを保持します):

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(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}

シーケンスを操作する:

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
flatten(nested_structure)   # flat_list
distinct('abacbdd')         # list('abcd')

split(odd, range(5))        # ([1, 3], [0, 2, 4])
split_at(2, range(5))       # ([0, 1], [2, 3, 4])
group_by(mod3, range(5))    # {0: [0, 3], 1: [1, 4], 2: [2]}

partition(2, range(5))      # [[0, 1], [2, 3]]
chunks(2, range(5))         # [[0, 1], [2, 3], [4]]
pairwise(range(5))          # iter: [0, 1], [1, 2], ...

そして機能:

partial(add, 1)             # inc
curry(add)(1)(2)            # 3
compose(inc, double)(10)    # 21
complement(even)            # odd
all_fn(isa(int), even)      # is_even_int

one_third = rpartial(operator.div, 3.0)
has_suffix = rcurry(str.endswith)

デコレータを簡単に作成する:

@decorator
def log(call):
    print call._func.__name__, call._args
    return call()

抽象的な制御フロー:

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)

デバッグを簡単にする:

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 models

そして、 はるかに

ダイビング

Funcyは私がいくつかのエッセイで説明したアイデアの具体化です:

テストの実行

デフォルトのPythonを使ってテストを実行するには:

pip install -r test_requirements.txt
py.test

完全にtoxを走らせるには、サポートされているすべてのtoxがインストールされている必要があります。 これらは2.6+、3.3+、PyPy、PyPy3です。 あなたは上記のすべてが不在の場合でも特定の環境のために実行することができます:

tox -e py27
tox -e py34
tox -e lint







-Suor
-, ,

執筆者: