JuliaPy / PyCall.jl

Package to call Python functions from the Julia language
MIT License
1.47k stars 190 forks source link

Speculative: Tools for wrapping Python libraries #61

Open malmaud opened 10 years ago

malmaud commented 10 years ago

Is there any interest in expanding the scope of this package to include more tools for conveniently wrapping Python libraries? I'm thinking of functionality like

I realize that these things can't be done in full generality since fields and methods can be dynamically created in Python at any time and the types of an instance's attributes might change at any time, but many Python packages don't really rely on that functionality.

ivarne commented 10 years ago

What would the benefit be?

If you are going to have a python class wrapped in a julia type, I can not see how you would avoid having to call a py_update(obj::py_wrapped_type) function on the type before accessing any of the fields. Without that there is no hook in julia to intercept the access and ask python what the value is now.

malmaud commented 10 years ago

The point is wrapping the return value of some Python function calls as a Julia native composite type, just like PyPlot wraps matplotlib's Figure class.

malmaud commented 10 years ago

I definitely wasn't thinking that there would be synchronization between the wrapped Julia representation of a Python object and the object's attributes in the Python runtime.

diegozea commented 10 years ago

I was thinking maybe in a julian keyword for @pyimport, or something similar, which create a Julia type for Python class and methods applied to this class in a Julian way.

Now:

@pyimport Bio.Seq as s
@pyimport Bio.Alphabet as a
my_dna = s.Seq("AGTACACTGGT", a.generic_dna)
my_dna[:find]("ACT")

This idea:

@pyimport julian from Bio.Seq import Seq
@pyimport Bio.Alphabet as a
my_dna = Seq("AGTACACTGGT", a.generic_dna)
find(my_dna,"ACT")

I don't have any idea about how implement it, but maybe we can use something like this (?):

>>> [method for method in dir(Seq) if callable(getattr(Seq, method))]
['__add__', '__class__', '__cmp__', '__contains__', '__delattr__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__len__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_get_seq_str_and_check_alphabet', 'back_transcribe', 'complement', 'count', 'endswith', 'find', 'lower', 'lstrip', 'reverse_complement', 'rfind', 'rsplit', 'rstrip', 'split', 'startswith', 'strip', 'tomutable', 'tostring', 'transcribe', 'translate', 'ungap', 'upper']