使用pybitshares时遇到的一些问题

Words
879
Reading
4 min
Listen
Play
6y

今天尝试pybitshares写一些脚本,为此特意重温了以前的一些文章,心里也在感慨,保持记录真是个好习惯,时隔三年多,翻看一下旧文章,省却我大把的学习时间。

image.png
(图源 :pixabay)

位置参数

然而,在运行如下代码时,却出现了问题:

from bitshares.asset import Asset
from bitshares import BitShares
bitshares = BitShares(node="http://127.0.0.1:8099")
asset=Asset(asset="CNY", bitshares_instance=bitshares)

出现类似如下错误,大意就是缺少位置参数;

TypeError: init() missing 1 required positional argument: 'data'

可是,我以前一直都是这样用的啊,也没出现过类似的问题啊。为此特意看了一下对应库函数的代码:

image.png

然后再看看看三年前库函数的代码:

image.png

先不去考虑父类的实现,至少在当前这个层面上,三年前的代码中,asset参数是被展开成实际内容啦,还按三年前的风格写当然行不通啦。应该将上述代码中的对应语句改成:

asset=Asset("CNY", bitshares_instance=bitshares)

共享实例初始化错误

上述代码执行没啥错误信息了,不过也没做啥事,于是乎我在上述代码后追加了如下语句:

feed = asset.feed
from pprint import pprint
pprint(feed)

哇,咔咔咔一大堆错误,但是最终的错误信息类似如下:

ValueError: Only support http(s) and ws(s) connections!

并且从错误信息中,我们不难发现其实其实和shared_blockchain_instance有关:

self._blockchain = self.shared_blockchain_instance()

也就是说,初始化shared_blockchain_instance的时候出现了错误,而原因则是shared_blockchain_instance使用的默认节点没有设置或者已经失效了。

那么我们来重新设置一下节点信息:

uptick set node http://127.0.0.1:8099

再来看一下我们设置的结果:

uptick configuration

显示如下:

image.png

再来运行我们的程序,结果一切正常,显示如下:

image.png

进一步探究

到这,问题已经解决了,如果不求甚解的话,似乎一切都很完美。不过如果回想一下,我们会发现,我明明已经设置了节点啊:

bitshares = BitShares(node="http://127.0.0.1:8099")
asset=Asset(asset="CNY", bitshares_instance=bitshares)

按说程序应该使用使用我设置的节点就可以,用什么shared_blockchain_instance呢?

看了一下出错信息,其中有这样一条内容:

File "/home/test1234/venv/lib/python3.6/site-packages/bitshares/price.py", line 388, in init
"settlement_price": Price(feed["settlement_price"]),

取消uptick设置的节点,然后进行如下测试:

from bitshares.price import Price
Price("0.3314 USD/BTS") * 2

我以为仅仅就是处理一下价格显示,应该用不到节点,然而事实上Price也是继承graphenecommon.price,所以也包含了shared_blockchain_instance等设置(其实我认为没有必要)

既然用到了节点信息,那么调用时也应该传入bitshares_instance才对,所以应该在对应代码中加入传入实例的语句:

"settlement_price": Price(feed["settlement_price"]),

我在考虑如何加的时候,突然想,这么明显的BUG没人提嘛?然后我去看了一下最新的代码,发现代码里其实已经修正过来了:

image.png

所以其实我更新一下库就可以啦,不过也不算白探究,至少了解了来龙去脉嘛。

总结

那么总结一下,大概就是以下几点:

  • 不要按老的方式写代码,要与时俱进
  • 发现BUG的时候,看看对应的库有没有更新,也许人家早就修复了
  • shared_blockchain_instance 其实并不是必要,不过了解一下怎么设置也好,另外命令行操作时也是需要这个的。
使用pybitshares时遇到的一些问题 | Ecency