首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyclips:将clips类实例multislot设置为[]时出错

Pyclips:将clips类实例multislot设置为[]时出错
EN

Stack Overflow用户
提问于 2018-07-09 20:36:20
回答 2查看 162关注 0票数 0

我希望一个类实例的多槽成为一个空的列表。我不确定是否在剪辑或pyclips中有bug,或者我做错了。

代码语言:javascript
复制
import clips

C = clips.BuildClass("C", "(is-a USER)(multislot s)")
i = clips.BuildInstance("test1", C)
#i.Slots['s'] = clips.Multifield([])          # error
i.Slots['s'] = []                             # error
#i.Slots['s'] = clips.Multifield(["1", "4"])  # no error
#i.Slots['s'] = ["1", "4"]                    # no error
print i.Slots["s"]

我得到了这个错误:_clips.ClipsError: C09: unable to understand argument

堆栈跟踪:

代码语言:javascript
复制
File "\\VBOXSVR\vagrant\return_empty_list_bug.py", line 6, in <module>
  i.Slots['s'] = [] # error
File "c:\Python27\Lib\site-packages\clips\_clips_wrap.py", line 175, in _WRAPPER
  return f(self, *args)
File "c:\Python27\Lib\site-packages\clips\_clips_wrap.py", line 269, in _WRAPPER
  return f(self, *newargs)
File "c:\Python27\Lib\site-packages\clips\_clips_wrap.py", line 2506, in __setitem__
  _c.directPutSlot(self.__instance, name, _py2cl(v))

_clips.ClipsError: C09: unable to understand argument
EN

回答 2

Stack Overflow用户

发布于 2018-07-09 23:45:46

上面的例子可以在clipspy中运行。

代码语言:javascript
复制
import clips

environment = clips.Environment()
environment.build('(defclass C (is-a USER) (multislot s))')

c_class = environment.find_class('C')
instance = c_class.new_instance('test1')

instance['s'] = []

print(instance)
print(instance['s'])

输出。

代码语言:javascript
复制
[test1] of C (s)
[]
票数 1
EN

Stack Overflow用户

发布于 2018-07-10 20:02:37

问题似乎出现在文件clipsmodule.c的第1788行:

代码语言:javascript
复制
case MULTIFIELD:
    if(!PyList_Check(value))
        goto fail;
    n = PyList_Size(value);
    if(n == 0) goto fail;          // <---- This seems to cause the error.
    if(!(do_value = EnvCreateMultifield(env, n)))
        goto fail;
    for(i2 = 0; i2 < n; i2++) {
        item = PyList_GetItem(value, i2);
        if(!item)
            goto fail;
        if(!i_py2do_mfhelp_e(env, item, do_value, (int)(i2 + 1)))
            goto fail;
    }
    break;  /* n is still good for below */

我不知道为什么会有这个检查,如果我取消注释它会有什么影响。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51245752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档