jima80525 / ctypes_example

Code associated with an upcoming blog post discussing ctypes and python bindings in general
MIT License
61 stars 34 forks source link

creating uneeded instances #4

Open jsbueno opened 6 years ago

jsbueno commented 6 years ago

https://github.com/jima80525/ctypes_example/blob/07e89a10b5b933212932473f6f7f47c38e2a01d0/tutorial2/testWrappedPoint.py#L29

This calling of the wrapper functions and assignment to the instance on every new point instantiation just looks bad. It is not that bad, as the wrapped functions are not new objects, but it remakes the assignment to the unique func in the ctypes wrapper for the library (although it would still have a major impact would one write actual Python code dealing with a couple hundred of Point instances)

I'd suggest just making the wrap call once, on top level code, would be much more elegant here:

class Point(...):
    ...
    def move(self):
         Point._move_point_func(self)

# These assignments must be after class body, due to the needed referenc  to the class itself.
 Point._move_point_func = wrap_function(lib, 'move_point', None, [Point])
...

(I am not sure if the functions wrapped by ctypes have a proper __get__. If they have, you might not even need the intermediate move method)

jima80525 commented 6 years ago

Thanks! I'll play around with that when I get a minute or two. I REALLY appreciate that suggestion! I learned a great deal figuring out this demo and I'm glad to get to learn some more from it! I'll leave this open until I work through your suggestion.

Thank you!

jima80525 commented 6 years ago

I created a pull request if you've got a few minutes. I think this is what you were getting at.
https://github.com/jima80525/ctypes_example/pull/6

Also, I didn't quite follow your final comment. Is it along the lines of hooking into the getattr function of the Line class, looking up the attributes of the library and then automatically calling an existing function?

I might play with that next.

Thanks again for your ideas! I really appreciate it!