Hi, You also need to remove the call to objc.selector. With correct metadata “blocks” are callables in Python code.
Ronald — Twitter: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/ > On 6 Jan 2020, at 23:59, Rand Dvorak <randdvo...@gmail.com> wrote: > > Same result: > > Updated code: > > import objc > CRApplication = objc.lookUpClass("CRApplication") > objc.registerMetaDataForSelector( > b'CRApplication', > b'get_block_', > { > 'arguments': { > 2: { > 'callable': { > 'arguments': { > 0:{'type': b'^v'}, > 1:{'type': b'@'}, > 2:{'type': b'@'}, > 3:{'type': b'@'} > }, > ' retval': { 'type': b'v' } > } > } > } > } > ) > global server > > def helloHandler(self, request, response, handler): > response.send_("Hello World!") > handler() > > if __name__ == "__main__": > server = CRApplication.sharedApplication().delegate().server() > server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@')) > server.startListening() > > > results: > > Traceback (most recent call last): > File "main.py", line 37, in <module> > server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@')) > TypeError: Argument 3 is a block, but no signature available > > >> On Jan 6, 2020, at 09:27, Ronald Oussoren <ronaldousso...@mac.com >> <mailto:ronaldousso...@mac.com>> wrote: >> >> >> >>> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvo...@gmail.com >>> <mailto:randdvo...@gmail.com>> wrote: >>> >>> >>> I am trying to implement a simple server in PyObjC for the Criollo HTTP >>> server. The server has a method to set route handlers by passing a block >>> to setup the route and then when it receives and HTTP request for the route >>> it calls the block. The block has the signature: >>> >>> typedef void(^CRRouteBlock)(CRRequest* _Nonnull request, CRResponse* >>> _Nonnull response, CRRouteCompletionBlock _Nonnull completionHandler); >>> >>> >>> So, here is my simple proof of concept: >>> >>> import objc >>> CRApplication = objc.lookUpClass("CRApplication") >>> global server >>> >>> def helloHandler(self, request, response, handler): >>> response.send_("Hello World!") >>> handler() >>> >>> if __name__ == "__main__": >>> server = CRApplication.sharedApplication().delegate().server() >>> server.get_block_("/", objc.selector(helloHandler, >>> signature=b'v@:@@@‘)) *** error occurs here >>> server.startListening() >>> >>> >>> But, when I try to setup the route I get the following error: >>> >>> Traceback (most recent call last): >>> File "main.py", line 21, in <module> >>> server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@')) >>> TypeError: Argument 3 is a block, but no signature available >>> >>> >>> Any ideas how to workaround this issue and implement the route handlers in >>> PyObjC? >> >> The code below should do the trick, but eas typed directly into this mail >> and might therefore contain syntax errors. >> >> import objc >> objc.registerMetaDataForSelector( >> b”CRApplication”, # name of the class implementing “get_block:”, or >> “NSObject” >> b”get_block:”, >> { >> “arguments”: { >> 2: { >> “callable”: { >> “arguments”: { >> 0: { “type”: b”^v” }, >> 1: { “type”: b”@” }, >> 2: { “type”: b”@” }, >> 3: { “type”: b”@” } >> }, >> “retail”: { “type”: b”v” } >> } >> } >> } >> ) >> >> This tells the bridge the signature for the block argument of the >> “get_block:” selector, which is information that cannot be retrieved from >> the Objective-C runtime. Argument 2 is the first real argument of ObjC >> selectors, after the implicit arguments “self” and “_imp” (which is not >> available in python code). >> >> Ronald >> — >> >> Twitter: @ronaldoussoren >> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/> >>> _______________________________________________ >>> Pythonmac-SIG maillist - Pythonmac-SIG@python.org >>> <mailto:Pythonmac-SIG@python.org> >>> https://mail.python.org/mailman/listinfo/pythonmac-sig >>> <https://mail.python.org/mailman/listinfo/pythonmac-sig> >>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG >> >
_______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org https://mail.python.org/mailman/listinfo/pythonmac-sig unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG