0101 / pipetools

Functional plumbing for Python
https://0101.github.io/pipetools/
MIT License
203 stars 17 forks source link

Using `x > pipe | foo | bar` gives different results than `(pipe | foo | bar)(x)` #3

Closed pickledish closed 6 years ago

pickledish commented 6 years ago

Not totally sure about anything here (this is my first time leaving a bug) but it seems like I've found a situation where these two seemingly-the-same statements do different things. I've included a minimal example:

import numpy as np
from pipetools import pipe

def scaleDiagonal(matrix):

    m = np.copy(matrix)
    size = matrix.shape[0]

    smallest = min([ m[i,i] for i in range(size) ])

    for i in range(size):
        m[i,i] = m[i,i] / smallest

    return m

x = np.array([1,2,3,4,5,6,7,8,9]).reshape(3,3)

y = (pipe | scaleDiagonal)(x)         # Works
z = x > pipe | scaleDiagonal          # Errors
0101 commented 6 years ago

Hey, thanks for the report!

The limitation of the x > pipe syntax is that it's not going to work if x has __gt__ defined - which is probably the case for np.array. This should probably be mentioned in the documentation.

0101 commented 6 years ago

I looked into it a bit and there is really nothing straight forward that can be done about this. Since __gt__ on the input object will be called before __lt__ on the pipe, if the object returns a result there is no way to intercept it.

So at least I added a note about this in the docs.

pickledish commented 6 years ago

Yeah, no that makes sense -- I'm not surprised! Just nice that there's a note of it now so people aren't caught off guard. Thanks!