为了好奇,我通过添加print语句在CBV中进行测试:
def post(self, request, block_id):
sf = inspect.getsourcefile(request)
code = inspect.getsouce(request)
然而,我收到了错误:
TypeError: <WSGIRequest: POST '/article/create/1'> is not a module, class, method, function, traceback, frame, or code object.
Request
是一个对象,但它提示没有模块,类,方法,函数,回溯,框架或代码对象。
这是怎么发生的?
答案 0 :(得分:1)
非常简单:inspect.getsource()
和inspect.getsourcefile()
检查他们的第一个参数的类型并提出TypeError
如果它既不是模块(module
类的实例),也是类( type
类的实例),方法(instancemethod
类型的实例),函数(function
类的实例),traceback(traceback
类型的实例),等等...... FWIW明确记录了这些限制:
>>> import inspect
>>> help(inspect.getsource)
Help on function getsource in module inspect:
getsource(object)
Return the text of the source code for an object.
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a single string. An
IOError is raised if the source code cannot be retrieved.
您的request
对象不属于这些对象,因此inspect
通过引发TypeError
来拒绝它,这会产生感觉,因为它只能获取具有源的内容的源代码代码组件。
如果您需要WSGRequest
类的源代码,则必须自行传递该类:
def post(self, request, block_id):
sf = inspect.getsourcefile(type(request))
code = inspect.getsouce(type(request))