[Jim Fulton] >> Documented the new Py_VISIT macro to simplify implementation of >> tp_traverse handlers. (Tim made me do it. ;) [Raymond Hettinger] > That Tim has been tyrant lately ;-) It's the only way left to get things done <wink>. >> + /* Utility macro to help write tp_traverse functions */ >> + #define Py_VISIT(op) \ >> + do { \ >> + if (op) { \ >> + int vret = visit((op), arg); \ >> + if (vret) \ >> + return vret; \ >> + } \ >> + } while (0) > I tried out this macro with the itertools module and found that it did a > nice job of compacting boilerplate code. > > One thought jumped out though. The macro assumes that the enclosing > function has consistent with the use of the variable names "visit" and > "arg": > > static int > islice_traverse(isliceobject *lz, visitproc visit, void *arg) > { > Py_VISIT(lz->it); > return 0; > } > > If the parameters are named something else ("vfunc" for example), > MSVC++6.0 complains: > > C:\py24\Modules\itertoolsmodule.c(1118) : warning C4013: 'visit' > undefined; assuming extern returning int > > Don't know if it is worth it, but you could safeguard the macro by > including visit and arg in the parameter list. -1. Instead it should be documented that the tp_traverse implementation *must* name its arguments "visit" and "arg" if it wants to use this macro. Since tp_traverse implementations *can* look so relentlessy the same, it's a Positive Good to encourage them to look relentlessly the same. I want the process of writing a correct tp_traverse implementation to be mindlessly simple, and likewise I want the process of reviewing one to be as simple as asking "did it apply VISIT to each member and then return 0?". Rigid uniformity helps both goals -- and as there's no creative joy to be had in trying to write a clever tp_traverse either, deviation from a rigid template would just be gratuitous deviation. principled-perversion-is-a-different-story-ly y'rs - tim
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4