今天尝试pybitshares写一些脚本,为此特意重温了以前的一些文章,心里也在感慨,保持记录真是个好习惯,时隔三年多,翻看一下旧文章,省却我大把的学习时间。
(图源 :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'
可是,我以前一直都是这样用的啊,也没出现过类似的问题啊。为此特意看了一下对应库函数的代码:
然后再看看看三年前库函数的代码:
先不去考虑父类的实现,至少在当前这个层面上,三年前的代码中,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
显示如下:
再来运行我们的程序,结果一切正常,显示如下:
进一步探究
到这,问题已经解决了,如果不求甚解的话,似乎一切都很完美。不过如果回想一下,我们会发现,我明明已经设置了节点啊:
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没人提嘛?然后我去看了一下最新的代码,发现代码里其实已经修正过来了:
所以其实我更新一下库就可以啦,不过也不算白探究,至少了解了来龙去脉嘛。
总结
那么总结一下,大概就是以下几点:
- 不要按老的方式写代码,要与时俱进
- 发现BUG的时候,看看对应的库有没有更新,也许人家早就修复了
- shared_blockchain_instance 其实并不是必要,不过了解一下怎么设置也好,另外命令行操作时也是需要这个的。