Giter VIP home page Giter VIP logo

fn.py's People

Contributors

adamsar avatar aitjcize avatar alphaho avatar calebsmith avatar ccfontes avatar danielhfrank avatar digenis avatar gabrielpjordao avatar kachayev avatar kangol avatar mjkaye avatar pawroman avatar sbinq avatar w-m avatar z4y4ts avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fn.py's Issues

ImportError: cannot import name Iterable from collections on Python 3.10

It just doesn't work. It expects Iterable from collections but this is not available.

This log is from building python310Packages.fn with nix but should be reproducible on any python 3.10 out there

Sourcing python-remove-tests-dir-hook
Sourcing python-catch-conflicts-hook.sh
Sourcing python-remove-bin-bytecode-hook.sh
Sourcing setuptools-build-hook
Using setuptoolsBuildPhase
Using setuptoolsShellHook
Sourcing pip-install-hook
Using pipInstallPhase
Sourcing python-imports-check-hook.sh
Using pythonImportsCheckPhase
Sourcing python-namespaces-hook
Sourcing setuptools-check-hook
Using setuptoolsCheckPhase
@nix { "action": "setPhase", "phase": "unpackPhase" }
unpacking sources
unpacking source archive /nix/store/bhfhqwy9y6x63h4dq2lpimzkl0b2b29i-fn-0.4.3.tar.gz
source root is fn-0.4.3
setting SOURCE_DATE_EPOCH to timestamp 1407495729 of file fn-0.4.3/setup.cfg
@nix { "action": "setPhase", "phase": "patchPhase" }
patching sources
@nix { "action": "setPhase", "phase": "configurePhase" }
configuring
no configure script, doing nothing
@nix { "action": "setPhase", "phase": "buildPhase" }
building
Executing setuptoolsBuildPhase
Traceback (most recent call last):
  File "/build/fn-0.4.3/nix_run_setup", line 8, in <module>
    exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\\r\\n', '\\n'), __file__, 'exec'))
  File "setup.py", line 6, in <module>
    import fn
  File "/build/fn-0.4.3/fn/__init__.py", line 1, in <module>
    from .stream import Stream
  File "/build/fn-0.4.3/fn/stream.py", line 9, in <module>
    from .iters import map, range
  File "/build/fn-0.4.3/fn/iters.py", line 2, in <module>
    from collections import deque, Iterable
ImportError: cannot import name 'Iterable' from 'collections' (/nix/store/443qk9752l44kfp8pzsrp0m9jyq6jz2p-python3-3.10.3/lib/python3.10/collections/__init__.py)

Backlinks: NixOS/nixpkgs#167402

Add LinkedList.from_iterable

Similar to FingerTree.from_iterable.

I currently have an iterable_to_linkedlist function, but it would be easier if that feature was part of LinkedList.

def iterable_to_linkedlist(it):
    ''' iterable -> LinkedList

    produces LinkedList with the contents of the consumed iterable
    '''
    return foldr(lambda x, y: y.cons(x), LinkedList())(tuple(it))

foldr so it preserves order, tuple(it) in case "it" is an iterator (otherwise the reversed() in foldr complains).

Suggestions for improved implementation? Otherwise I'm happy to make a pull-request.

API Documentation

Hi, interesting library!

Do you have a function to use-case reference?
Something similar to https://ramdajs.com/docs

Coming back to Python from javascript and it's a difficulty curve for new users if they have to dig through the source to find use cases.

If you don't have one, perhaps we could setup a Github action to generate the docs using pydoc or other, whenever a merge to master happens?

iters.flatten attempts to flatten dict

Hi, It's quite misleading that flatten does not ignore dictionaries.

For instance, the following snippet is not expected for most flatten arounds.

In: list(iters.flatten([{'a':1}]))
Out: ['a']

It seems more useful to have it return [{'a': 1}] in this case.

There are wrong comments here

class F(object):
    def __rshift__(self, g):
        """Overload << operator for F instances"""
        return self.__class__.__compose(self.__ensure_callable(g), self.f)

    def __lshift__(self, g):
        """Overload >> operator for F instances"""
        return self.__class__.__compose(self.f, self.__ensure_callable(g))

the operator >> is right shift and << is left shift respectively

Required `memoise` function

I haven't found memoise function implementation. I suggest to have at least two implementations with weakref and regular dictionary.

how to use _ in a function

I've try :
print math.sin(_)
it turn out to be wrong, but it works for:
lambda x: math.sin(x)

Does _ always be same as lambda caluse?
any limitation?
thx ~~

getattr operator fails with default value in _

Easy to reproduce using fn.op.foldr (cause it's initially flip given function in order to work with c-level reducing).

>>> from fn import _ as XXX
>>> from fn.op import flip, foldr
>>>
>>> flip(XXX + XXX)
getattr((_ + _), __flipback__)
>>>
>>> foldr(XXX + XXX)([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "fn/op.py", line 70, in fold
    return iters.reduce(*args)
  File "fn/underscore.py", line 85, in __call__
    return self._callback(*args)
  File "fn/func.py", line 51, in __call__
    return self.f(*args, **kwargs)
  File "fn/func.py", line 32, in <lambda>
    return cls(lambda *args, **kwargs: f(g(*args, **kwargs)))
AttributeError: 'int' object has no attribute '__flipback__'

Strange _ behavior

Hi!
I ran your example and got this:

In [1]: from fn.iters import map
In [2]: from fn import _
In [3]: list(map(_ * 2, range(5)))
Out[3]: [0, 2, 4, 6, 8]
In [4]: list(map(_ * 2, range(5)))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-448bfa47eeda> in <module>()
----> 1 list(map(_ * 2, range(5)))
TypeError: 'list' object is not callable

python 2.7.3 windows 7 x64

Test fails for PyPy (FingerTreeDequeTestCase)

Currently, the test fails for PyPy as shown below.

======================================================================

FAIL: test_iterator (__main__.FingerTreeDequeTestCase)

----------------------------------------------------------------------

Traceback (most recent call last):

File "tests.py", line 1083, in test_iterator

self.assertEqual([], list(Deque()))

AssertionError: Lists differ: [] != [<function <lambda> at 0x00007...

Second list contains 1 additional elements.

First extra element 0:

<function <lambda> at 0x00007fe2f940b9e8>

- []

+ [<function <lambda> at 0x00007fe2f940b9e8>]

----------------------------------------------------------------------

Ran 123 tests in 1.195s

FAILED (failures=1)

curried decorator does not work with type annotations

from fn.func import curried
@curried
def sum5(a, b, c, d, e):
    return a + b + c + d +e
sum5(1)(2)(3)(4)(5)
Out[6]: 15
@curried
def sum5(a: int, b: int, c: int, d: int, e: int):
    return a + b + c + d +e
sum5(1)(2)(3)(4)(5)
Traceback (most recent call last):
  File "/home/sphelps/mambaforge/envs/symbiotica-fund/lib/python3.10/site-packages/IPython/core/interactiveshell.py", line 3505, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-8-e80b0556d52b>", line 1, in <module>
    sum5(1)(2)(3)(4)(5)
  File "/home/sphelps/mambaforge/envs/symbiotica-fund/lib/python3.10/site-packages/fn/func.py", line 78, in _curried
    spec = getargspec(f)
  File "/home/sphelps/mambaforge/envs/symbiotica-fund/lib/python3.10/inspect.py", line 1237, in getargspec
    raise ValueError("Function has keyword-only parameters or annotations"
ValueError: Function has keyword-only parameters or annotations, use inspect.signature() API which can support them

underscore lambda cannot use __contains__ (IOW "in") [renamed issue]

I often find myself in the situation where I want to create a filter and, if using the underscore syntax, _ is a sequence. For instance:

    my_filter = F() >> (filter, _[1] in TYPE_MAP)

In this situation, _ will be an item from a dict.items() and will, therefore, be a 2-tuple. I want my_filter to return only the items for which the value (the second item in the 2-tuple) is in TYPE_MAP.

However, when run, the above code results in TypeError: "'bool' object is not callable". It looks as if it's trying to evaluate _[1] in TYPE_MAP at the time of partial function creation, rather than when actually calling the resulting function.

Is there a way to achieve this with the underscore syntax, or do I just have to use the lambda syntax?

Thanks

Option class should have all methods of Full and Empty

Otherwise pylint complains (fairly) that Option does not have, for example, "map".

Just add these lines at monad.py:72

    def map(self, callback):
        raise NotImplementedError()

    def filter(self, callback):
        raise NotImplementedError()

    def get_or(self, default):
        raise NotImplementedError()

    def get_or_call(self, callback, *args, **kwargs):
        raise NotImplementedError()

    def or_else(self, default):
        raise NotImplementedError()

    def or_call(self, callback, *args, **kwargs):
        raise NotImplementedError()

This is a pretty minor issue and somewhat stylistic, so feel free to ignore :) Thanks for the nice library!

make fn._ pickle

I want use fn._ in a spark program. e.g.

 num = rdd.filter('00:00:00' <= _[0] <= '12:00:00')

but I got serialize error, can any one give me some advice to solve this problem.

PEP-8?

As per http://legacy.python.org/dev/peps/pep-0008. Just to make the codebase look more organised and consistent.

I'm not sure how mature packages like 'autopep8' are at present, but worth having a look if we are going with this. There is no harm doing it manually though. Optionally, we can also add 'flake8' testing to CI for future commits.

What are your thoughts on this, @kachayev?

Active Fork?

Has anyone considered starting an active fork of this repo? I see it has been forked a number of times, but no forks are being actively maintained.

I don't feel qualified to maintain a project like this, but it is such a great library I don't want it to die! If no one else steps up within a month I'll create a fork and pledge to provide active updates. The fork will have to be deployed on PyPi as well.

Function Composition

Often, when I chain functions, I find myself using the following pattern:

(F() >> foo >> bar >> baz)(x)

If this were clojure, I could write:

(-> x foo bar baz)

Notice the input on the left. Is there any to way to do this in python/fn?

Method calling from _ not working?

Hi,

I'm not sure whether this is supposed to work:

from fn import _ as X
X.endswith('tif')('image.tif')

This prints "False".

Looking at the tests I see this form:

from fn import _ as X
X.call('endswith', '.tif')('image.tif')

This correctly evaluates to True, but is significantly uglier. What's happening in the first form?

Currying

I tried this code for function currying

from fn.func import curried
@curried
def sum5(a, b, c, d, e):
    return a + b + c + d + e

sum5(1)(2)(3)(4)(5)
15
sum5(1, 2, 3)(4, 5)
15

but when I call the function I get the following error

Traceback (most recent call last):
File "", line 1, in
File "fn/func.py", line 83, in _curried
return curried(partial(func, _args, *_kwargs))
File "fn/func.py", line 69, in curried
@wraps(func)
File "/usr/lib/python2.7/functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'functools.partial' object has no attribute 'module'

@composable decorator

Special @composable decorator to bring new functionality to function:

  • easy way to compose functions (using one of standard operators)
  • overload apply operator

(question) Folds implementation and reduce()

I want to add foldl and foldr tomorrow, but I feel like this needs some discussion. CPython's builtin reduce() is a left-fold. Can/should we rely on this or should it be replaced with a custom left-fold implementation? reduce() should be faster, but the actual result of it is up to the implementation if I understand correctly.

Test fails for Python 3.x ('reduce' not defined)

Currently, the test fails for Python 3.x due to reduce not being defined.

======================================================================
ERROR: test_iterator (__main__.FingerTreeDequeTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 1086, in test_iterator
    self.assertEqual(sum(range(1,20)), sum(Deque.from_iterable(range(1,20))))
  File "/home/microamp/devel/projs/fn.py/fn/immutable/finger.py", line 138, in from_iterable
    return FingerTree.from_iterable(lambda x: x, it)
  File "/home/microamp/devel/projs/fn.py/fn/immutable/finger.py", line 122, in from_iterable
    return reduce(lambda acc, curr: acc.push_front(curr), it, tree)
NameError: global name 'reduce' is not defined

----------------------------------------------------------------------
Ran 123 tests in 0.110s

FAILED (errors=1)

about rock tail recursion


@tail_call_optimized
def even(x):
if x == 0: return True
return odd(x-1)

@tail_call_optimized
def odd(x):
if x == 0: return False
return even(x-1)

print even(100000)

can recur.tco resolve rock tail recursion?


Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.