学习Programming the Semantic Web遇到的问题(一)——python: unexpected keyword argument

根据书中敲的代码如下:

from simpletriple import SimpleGraph

class InferenceRule:
    def getqueries(self):
	return []

    def maketriples(self, binding):
	return self._maketriples(**binding)

    
				
class WestCoastRule(InferenceRule):
    def getqueries(self):
	sfoquery = [('?company', 'headquarters', 'San_Francisco_California')]
	seaquery = [('?company', 'headquarters', 'Seattle_Washington')]
	laxquery = [('?company', 'headquarters', 'Los_Angelese_California')]
	porquery = [('?company', 'headquarters', 'Portland_Oregon')]
	return [sfoquery, seaquery, laxquery, porquery]

    def _maketriples(self, company):
	return [(company, 'on_coast', 'west_coast')]

if __name__ == '__main__':
    bg = SimpleGraph()
    bg.load('business_triples.csv')
    wcr = WestCoastRule()
    bg.applyinference(wcr)
    print list(bg.triples((None, 'on_coast', None)))


运行时提示:

File "c:\Users\user\Desktop\NLP\simpletriple.py", line 162, in applyinference
    new_triples = rule.maketriples(b)
  File "inferencerule.py", line 8, in maketriples
    return self._maketriples(**binding)
TypeError: _maketriples() got an unexpected keyword argument '?company'


发现原因如下:

在class InterenceRule 中,

def maketriples(self, binding):
	return self._maketriples(**binding)

在class WestCoastRule中;

def _maketriples(self, company):
	return [(company, 'on_coast', 'west_coast')]

调试发现, binding的值是{'?company': 'xxxx'}, return self._maketriples(**binding) 等于 retutn self._maketriples(?company = xxxx), 但是_maketriples的参数是company,意味着,正确调用_maketriples的方式是_maketriples(company = xxxxx), 这就是为啥报错说找不到keyword argument '?company', 因为正确的keyword argument是 'company', 所以我修改了一下maketriples的代码如下:


from simpletriple import SimpleGraph

class InferenceRule:
    def getqueries(self):
	return []

    def maketriples(self, binding):
	tempbind = {}
	for k, v in binding.items():
	    tempbind[k[1:]] = v
	return self._maketriples(**tempbind)

即把’?company‘的问号去掉即可。


另外,在修改代码的时候,又导致了另外一个错误:

File "inferencerule.py", line 9, in maketriples
    for k, v in binding:
ValueError: too many values to unpack


仔细发现,正确的代码是for k,v in binding.items(), 对于字典类型,不像list类型那样,可以直接for k in listb, 所以不要跟我犯同样的错误啦!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值