"Jan Jansen" <knack...@googlemail.com> wrote in message
news:f17500b71003030943w606925edie41b41d6d64ef...@mail.gmail.com...
Hi there,
I wonder what's the best way to wrap given function calls (in this case
ctype function calls but more generally built-in functions and those
kinds).
I have a huge c library and almost all functions return an error code. The
library also contains a function, that returns the corresponding error
message to the error code. So, what I need to do for every call to one of
the libraries functions looks like this:
error_code = my_c_library.SOME_FUNCTION_
CALL(argument)
if error_code != 0:
error_message = my_c_library.GET_ERROR_TEXT(error_code)
print "error in function call SOME_FUNCTION_CALL"
print error_message
my_c_library.EXIT_AND_CLEAN_UP()
ctypes has a couple of methods to post process return values.
1. A callable can be assigned has the .restype attribute of the function
object. In this case, the function is assumed to return an integer, and it
is passed to the callable. The function could raise an exception for
non-zero return values. This usage is deprecated. See "16.15.1.8. Return
types" in the Python docs (http://docs.python.org/library/ctypes.html).
2. Any return type can be assigned to .restype, and a callable can be
assigned to the .errcheck attribute. This has more flexibility than #1
since it works for return types without int. The callable is provided the
return value, original function object, and original arguments to help
customize the behavior of the return value. See "16.15.2.3. Foreign
functions" in the docs.
Also, for some function calls I would need to do some preperations like:
error_code = my_c_library.LOG_IN_AS_ADMINISTRATOR(admin_user,
admin_password)
error_code = my_c_library.SOME_FUNCTION_CALL(argument)
I like the decorator idea, but I can't figure out if it's applicable here.
To be able to call the function in a manner like this would be great, e.g.
@change_user(admin_user, admin_password)
@error_handling
my_c_library.SOME_FUNCTION_CALL(argument)
Decorators don't decorate calls to functions, just function declarations.
Here's a *rough* example:
def prep(func):
... def prepwork(*args,**kwargs):
... print 'doing prep work...'
... func(*args,**kwargs)
... return prepwork
...
@prep
... def something(a,b):
... print a,b
...
something(1,2)
doing prep work...
1 2
-Mark
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor