Package: knife
knifeis a powerfulPythonmultitool
loosely inspired byUnderscore.jsbut remixed for maximumpythonicity.knifeconcentrates power that is normally dispersed across the entire
Python universe in one convenient shrink-wrapped package.Vitalsknifeworks with CPython 2.6, 2.7, 3.1. and 3.2 and PyPy 1.8.knifedocumentation is athttp://readthedocs.org/docs/knife/en/latest/orhttp://packages.python.org/knife/InstallationInstallknifewithpip…:$ pip install knife
[... possibly exciting stuff happening ...]
Successfully installed knife…oreasy_install…:$ easy_install knife
[... possibly exciting stuff happening ...]
Finished processing dependencies for knife…or old school by downloadingknifefromhttp://pypi.python.org/pypi/knife/:$ python setup.py install
[... possibly exciting stuff happening ...]
Finished processing dependencies for knifeDevelopmentPublic repository:https://bitbucket.org/lcrees/knife.Mirror:https://github.com/lcrees/knife/Issue tracker:https://bitbucket.org/lcrees/knife/issuesLicense:BSD3 secondknifeThings go in:>>> from knife import __
>>> gauntlet = __(5, 4, 3, 2, 1)Things get knifed:>>> gauntlet.initial().rest().slice(1, 2).last()
knife.lazy.lazyknife ([IN: ([3]) => WORK: ([]) => HOLD: ([]) => OUT: ([3])])Things come out:>>> gauntlet.get()
3Slightly moreknifeknifehas 40 plus methods that can bechainedinto pipelines…contrived example:>>> __(5, 4, 3, 2, 1).initial().rest().slice(1, 2).last().get()
3…or used object-oriented style.contrived example:>>> from knife import knife
>>> oo = knife(5, 4, 3, 2, 1)
>>> oo.initial()
knife.active.activeknife ([IN: ([5, 4, 3, 2, 1]) => WORK: ([]) => HOLD: ([]) => OUT: ([5, 4, 3, 2])])
>>> oo.rest()
knife.active.activeknife ([IN: ([5, 4, 3, 2]) => WORK: ([]) => HOLD: ([]) => OUT: ([4, 3, 2])])
>>> oo.slice(1, 2)
knife.active.activeknife ([IN: ([4, 3, 2]) => WORK: ([]) => HOLD: ([]) => OUT: ([3])])
>>> oo.last()
knife.active.activeknife ([IN: ([3]) => WORK: ([]) => HOLD: ([]) => OUT: ([3])])
>>> oo.get()
3Aknifeobject can roll its current state back to previous states
like snapshots of immediately preceding operations, a baseline snapshot, or even
a snapshot of the original arguments.contrived example:>>> undone = __(1, 2, 3).prepend(1, 2, 3, 4, 5, 6)
>>> undone.peek()
[1, 2, 3, 4, 5, 6, 1, 2, 3]
>>> undone.append(1).undo().peek()
[1, 2, 3, 4, 5, 6, 1, 2, 3]
>>> undone.append(1).append(2).undo(2).peek()
[1, 2, 3, 4, 5, 6, 1, 2, 3]
>>> undone.snapshot().append(1).append(2).baseline().peek()
[1, 2, 3, 4, 5, 6, 1, 2, 3]
>>> undone.original().peek()
[1, 2, 3]knifeobjects come in two flavors:activeandlazy.active.knifeobjects evaluate the result of calling a
method immediately after the call. Calling the same method with
alazy.knifeobject only yields results when it is iterated over
orknife.lazy.lazyknife.getis called to get results.knife.lazy.lazyknifecombines allknifemethods in one class:>>> from knife import lazyknifeIt can be imported under itsdunderscore(knife.__) alias.>>> from knife import __knife.active.activeknifealso combines everyknifemethod in one
comboknifeclass:>>> from knife import activeknifeIt can be imported under itsknife.knifealias:>>> from knife import knifeknifemethods are available in more focused classes that group related
methods together. These classes can also be chained into pipelines.contrived example:>>> from knife.active import mathknife, reduceknife
>>> one = mathknife(10, 5, 100, 2, 1000)
>>> two = reduceknife()
>>> one.minmax().pipe(two).merge().back().min().get()
2
>>> one.original().minmax().pipe(two).merge().back().max().get()
1000
>>> one.original().minmax().pipe(two).merge().back().sum().get()
1002