Temel yuva soketinin kaybolması durumunda bir istisna oluşturabilen çok sayıda C++ işlevini sarar. Bağlantıyı yeniden kurmak ve/veya bir listedeki diğer mevcut sunucuları denemek için "bağlantı kur" işlevini nasıl değiştireceğimi anladım, ancak 80 sağlamak için bir try..except sarıcı oluşturmak için bir çözüm bulamıyorum. + C++ fonksiyonları.try..catch makro sarıcı eşdeğeri cython
#-- client.pxd ---
cdef extern from "rpc/RpcService.h":
cdef cppclass RpcServiceClient:
void getProject(ProjectT&, Guid& id) nogil except +
cdef extern from "client.h":
cdef cppclass Client:
RpcServiceClient proxy() nogil
cdef Client* getClient() nogil except +
#-- module.pxd ---
cdef inline Client* conn() except *:
# wrap getClient() here with try..except if the
# connection was never established
cpdef inline get_project(Guid& guid):
cdef:
ProjectT projT # cpp object
Project project # cdef python class
# this would catch fine in my conn() wrapper
# if the connection had never been established
# the first time. But if the existing connection
# suddenly drops, it will be getProject() that
# raises the exception
conn().proxy().getProject(projT, guid)
project = initProject(projT)
return project
Ben try_call()
gibi bir şey bu C++ işlevlerin hepsi sarmak nasıl herhangi bir ipucu?
def try_call(fn, *args, **kwargs):
# try fn(*args, **kwargs) and handle
try_call(conn().proxy().getProject, projT, guid)
Ama açıkçası ben piton nesneler olarak bu Cython işlevlerini geçemez (ya da belki elimden?): Bu saf piton olsaydı , ben sadece böyle bir şey yapabilirdi.
Veya C++ böyle bir şey:
TRY_CALL_OR_RECONNECT
conn().proxy().getProject(projT, guid)
END_TRY_CALL_OR_RECONNECT
Eğer bunu C++ 'da ve saf Python'da nasıl yapacağınızı biliyor iseniz ... Cython'da bunu yapmak için bir nedeniniz var mı? Neden her bir işleve makroyu yapıştıran bir C++ sarmalayıcısı yazmasın, sonra bunu Cython'a sarın veya Python tarafından eşdeğer olan Cython kodunun etrafına bir Python sarıcısı yazın. – abarnert
Sadece sezgilerden uzaklaşıyor, ama ben, sodhon işlevlerini python nesneleri olarak kullanamayacağınız için hiçbir neden görmüyorum. Sonuçta, C vb. Uygulanan kütüphane fonksiyonları da python işlev nesneleri olarak geçirilebilir. – azgult
@abarnert: Sardığım orijinal C++ işlevlerini değiştiremiyorum. Her bir çağrı etrafında bu makro sarmalayıcıları yerleştirmek için C++ alanında hiçbir yer yoktur. Bunu cython'da yapıyorum çünkü tüm modül cython. Aksi takdirde, cython modülünü içe aktaran ve her aramayı tamamlayan saf bir python sarıcı yazmam gerekirdi. – jdi