在使用beancount记录期权交易的过程中,由于标的物信息比较多,所以需要使用较长的commodity,但是这样就会报语法错误:
syntax error, unexpected NUMBER, expecting end of file or EOL or ATAT or AT
期权的几个信息包括证券代码、到期日、价格、C/P,这些必要的信息就已经很多了,除非简写,否则很容易就超过24个字符。例如BABA-HK_250127_112.50_CALL
,我想加下划线看得更清楚一点。如果人工缩的话肯定没问题,自动化处理的很可能就超24个字符了。
翻看了源码后,只找到commodity的词法定义:[A-Z][A-Z0-9\'\.\_\-]*[A-Z0-9]
(beancount/parser/lexer.l#L203),确认应该符合定义,所以大概率是长度的问题,但是没找到源码在哪里限制了长度。试了一下应该是超过24个字符就不行了。
在beancount讨论区请教了一下,有一位大佬指出在beancount/core/amount.py#L25有这样的定义[A-Z][A-Z0-9\'\.\_\-]{0,22}[A-Z0-9]
,才意识到是两个原因没找到代码:一是限制字符不一定是限制的24,它是限制的22然后前后各一个字符;二是代码在v2分支,当前的master是v3,其实长度限制已经被取消了。
那么问题来了,要怎么改才行呢?我试了一下修改beancount/lib/python3.12/site-packages/beancount/core/amount.py
文件依然不能解决问题。仔细看源码后,发现最终的pip包中,是通过lexer.l
生成lexer.c
然后编译成beancount/parser/_parser.cpython-312-x86_64-linux-gnu.so
实现的。所以直接修改源码中lexer.l的定义,修改为[A-Z]([A-Z0-9\'\.\_\-]{0,64}[A-Z0-9])?
。改完之后make,替换.so文件即可。试了一下其他的内容都完全不需要改。
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。