The X object¶
The X object is a shortcut for writing simple, one-argument lambdas.
It’s roughly equivalent to this: lambda x: x
Example:
~X.some_attr.some_func(1, 2, 3).whatever
# produces:
lambda x: x.some_attr.some_func(1, 2, 3).whatever
~(X > 5)
# produces:
lambda x: x > 5
Any of the supported operations performed on an
X object yield another one that remembers what was done to it, so they
can be chained.
The ~ operator creates the actual function that can be called (without
creating just another X instance). However, this can be omitted within
pipe and pipe-utils context where X is converted to a function
automatically:
users > where(X.is_staff) | foreach(X.first_name) | X[:10]
But you can make use of X even outside pipetools, you just have to
remember to prefix it with ~
my_list = list(users)
my_list.sort(key=~X.last_login.date())
Currently supported operations¶
Most Python operators are supported now, but if you’re still missing something you can add it yourself or create an issue on github.
- attribute access ( - __getattr__):- X.attr getattr(X, 'something') 
- comparisons: - ==,- !=,- <,- <=,- >,- >=:- X == something X <= 3 
- unary arithmetic operators ( - +,- -):- +X -X 
- binary arithmetic operators ( - +,- -,- *,- **,- @,- /,- //,- %):- X - 3 X + " ...that's what she said!" 3 - X # works in both directions 
- bitwise operators ( - <<,- >>,- &,- ^):- 1 >> X X & 64 
Current limitations¶
- call ( - __call__) will only work if X is not in the arguments:- # will work X.method() X(some, agrs, some=kwargs) # will not work obj.method(X) some_function(X, some=X) X.do(X) 
- item access or slicing ( - __getitem__) will only work if X is not in the in the index key:- # will work X['key'] X[0] X[:10] X[::-1] # will not work foo[X] bar[X:] baz[::X] X[X.columns] 
- is contained in / contains ( - in)- Unfortunately, - X in containercan’t be done (because the magic method is called on the container) so there’s a special method for that:- X._in_(container) - The opposite form - item in Xhas not been implemented either.
- special methods ( - ~,- |)- They have been given special meanings in pipetools, so could no more be used as bitwise operations. 
- logical operators ( - and,- or,- not) will not work; they are not exposed as magic methods in Python.
- await operator ( - await X) has not been implemented
