vsajip / pyp

Automatically exported from code.google.com/p/pyp
1 stars 0 forks source link

Feature request: end with python data #20

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
I want to end up with the data in a python shell to manipulate it futher, 
import my own modules etc. The easiest way I've found to do this is:

~/bin$ cat PypCustom.py
class PowerPipeListCustom():
    def pickle(self):
        import cPickle
        return "import cPickle; pp = cPickle.loads(%r)" % (cPickle.dumps(list(self)),)

~/bin$ python -i <(echo 123 | pyp "pp.sort() | pp.pickle()")
>>> pp
['123']

This fails for more complicated examples becaause pyp isn't on python's 
PYTHONPATH. (AttributeError: 'module' object has no attribute 'PypStr')

Original issue reported on code.google.com by tomer.ch...@gmail.com on 19 Mar 2013 at 1:38

GoogleCodeExporter commented 8 years ago
wow, that's pretty cool. would you mind adding it to the main code body and 
test it, and we'll roll it into our next dev release. Would it be possible to 
add something for "p" as well? 

thanks!

Original comment by tobyro...@gmail.com on 19 Mar 2013 at 6:50

GoogleCodeExporter commented 8 years ago
Sorry I don't use SVN.

Add these imports:
import copy_reg
try:
    import cPickle as pickle
except ImportError:
    import pickle

Add this before the Pyp class:

copy_reg.pickle(PypStr, lambda self: (str, (str(self),)))
copy_reg.pickle(PowerPipeList, lambda self: (list, (list(self),)))
copy_reg.pickle(PypList, lambda self: (list, (list(self),)))

Add this method to PowerPipeList:

    def pickle(self):
        """Usage with bash redirections:
        $ python -i <(informative_command | pyp "w[0].isdigit() | pp.sort() | pp.pickle()")
        >>> pp
        ['1 a', '2 b', '3 c']

        Usage with files:
        $ informative_command | pyp "w[0].isdigit() | pp.sort() | pp.pickle()" > my_data.py
        $ python -i my_data.py
        >>> pp
        ['1 a', '2 b', '3 c']

        pp.pickle() must be the last command in the chain.
        """
        return "import cPickle; pp = cPickle.loads(%r)" % (pickle.dumps(self),)

What do you want p.pickle() to do? It would pickle each line seperately but 
then there is no way to manipulate that string using pyp nor is there a way to 
load it into python.

Original comment by tomer.ch...@gmail.com on 19 Mar 2013 at 9:07

GoogleCodeExporter commented 8 years ago
Actually would be better if it generated "import pickle" if the cPickle import 
failed, although this is quite rare.

Original comment by tomer.ch...@gmail.com on 19 Mar 2013 at 9:10

GoogleCodeExporter commented 8 years ago
pretty cool. we'll try to add this to the next dev version. You're right, using 
pp is best.

Original comment by tobyro...@gmail.com on 22 Mar 2013 at 11:29