必须使用X实例作为第一个参数调用未绑定方法(改为使用str实例)

时间:2016-06-27 09:15:57

标签: python class methods

我正在使用pyelliptic,但我无法使用文件 ecc.py 中定义的方法raw_get_ecdh_key

这是我的示例代码:

>>> import pyelliptic
>>> pubkey1="0453eb8248f42b00d057bc1adc724c4c841ec75851d6cd86f56f9bae5223219c7d3c7aff832d2383dfec167327ef38e9bf066690a8f94c055b336a607cebc2dddf".decode('hex')
>>> pubkey2="04678b95e902b04817ba258ecd3dbb2150d83850848a3b8523c11d51b6a9f89b93ea82db74ba82ba44fadb050b35eae8b96f3738e88c7c117227303a528c8df985".decode('hex')
>>> pyelliptic.ECC.raw_get_ecdh_key(pubkey1, pubkey2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method raw_get_ecdh_key() must be called with ECC instance as first argument (got str instance instead)

我在这里搜索并发现了很多关于这个主题的问题。我了解到我需要拨打ECC()而不是ECC,但它不会更好:

>>> pyelliptic.ECC().raw_get_ecdh_key(pubkey1, pubkey2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pyelliptic/ecc.py", line 324, in raw_get_ecdh_key
    OpenSSL.EC_KEY_free(own_key)
UnboundLocalError: local variable 'own_key' referenced before assignment

我无法弄清楚什么是错的。我检查过,应该引用变量own_key

1 个答案:

答案 0 :(得分:0)

这是pyetiptic中一个非常明显的错误 - 如果你看一下代码,own_key被定义的部分(ecc.py第301行)被包装在巨大的try / finally块中。如果在301行之前引发(并且没有管理)异常(这显然是你发生的事情),那么执行流程将跳转到finally块,该块试图引用own_key这一点尚未定义。

您可以通过克隆git repo并编辑raw_get_ecdh_key函数的代码进行修复,以便1.在 {/ 1>}之前,在函数的开头定义相关的局部变量阻止(将它们设置为try)和2.在finally块中,这些变量在尝试使用它们来释放资源之前针对None进行测试,即(未经测试):

None

然后运行单元测试(最终为此案例添加一些测试)并向作者提交拉取请求。

请注意,您已经应用了这个(未经测试的)修补程序, 应该还有另一个错误 - 最初发送到def raw_get_ecdh_key(self, pubkey_x, pubkey_y): other_key = None other_pub_key_x = None other_pub_key_y = None other_pub_key = None own_key = None own_priv_key = None try: # (snip code) finally: if other_key is not None: OpenSSL.EC_KEY_free(other_key) if other_pub_key_x is not None: OpenSSL.BN_free(other_pub_key_x) if other_pub_key_y is not None: OpenSSL.BN_free(other_pub_key_y) if other_pub_key is not None: OpenSSL.EC_POINT_free(other_pub_key) if own_key is not None: OpenSSL.EC_KEY_free(own_key) if own_priv_key is not None: OpenSSL.BN_free(own_priv_key) 块的错误 - 但至少应该有关呼叫失败原因的更多信息。