在Python字节码中,CALL_FUNCTION
指令后跟的数字代表这次函数调用需要从栈上取出的参数的数量。具体来说,这个数字包括位置参数和关键字参数的数量。
这个数字的低两位表示位置参数的数量,然后每两位表示一个关键字参数的数量。因此,如果有3个位置参数和2个关键字参数,该数字会是3 + 2 * 256 = 515
。
举个例子(伪代码):
LOAD_GLOBAL user_analysis_function
CALL_FUNCTION 0
POP_TOP
CALL_FUNCTION
后跟的数字是0,因为user_analysis_function
不接受任何参数。如果user_analysis_function
接受一个位置参数,那么应该使用CALL_FUNCTION
指令后跟的数字是1。
为了避免混淆,如果只使用位置参数(没有关键字参数),数字直接代表位置参数的数量。例如,有3个位置参数时,数字就是3。
【Note】 对于CALL_FUNCTION
指令,操作数是由两部分组成的:低8位用于位置参数的数量,高8位用于关键字参数的数量。因此,如果你有3个位置参数和2个关键字参数,那么计算公式应该是:
3 + 2 * 256 = 515
在这个例子中,256是一个基数,代表一个位移。这是因为Python字节码使用16位来表示CALL_FUNCTION
指令的操作数。低8位用于表示位置参数的数量,高8位用于表示关键字参数的数量。
所以,2 * 256
是用来将关键字参数的数量放到高8位上,而3(位置参数的数量)则放在低8位上。当你将这两个数字相加时,你得到的是一个两部分组成的数字:高8位代表关键字参数的数量,低8位代表位置参数的数量。