【问题标题】:What is a Functor in Python?Python中的函子是什么?
【发布时间】:2016-03-13 19:12:51
【问题描述】:

我是 Python 新手。有人可以解释函子值的来源。 Functor = msg.functor,但没有对 functor 一词的解释,我试过用谷歌搜索它,但一无所获。 .val 关键字也没有在任何地方解释,我可能是昏暗的,但我找不到任何例子。

def process_action(self, msg, sender):  
    assert msg.get_type() == pedroclient.PObject.structtype
    functor = msg.functor
    assert functor.get_type() == pedroclient.PObject.atomtype
    cmd_type = functor.val
    cmd = msg.args[0]
    if cmd_type == 'stop_':
        assert cmd.get_type() == pedroclient.PObject.structtype
        cmd_functor = cmd.functor.val
        #if cmd_functor in ['pickup', 'putdown']:
        self.stop_arm(cmd.args[0].val)
        #else:
        #    self.stop_arm(cmd.args[0].val)

    elif cmd_type in ['start_', 'mod_']:
        self.start_animate()
        assert cmd.get_type() == pedroclient.PObject.structtype
        cmd_functor = cmd.functor.val
        if cmd_functor == 'pickup':
            self.pickup(cmd.args[0].val, cmd.args[1].val, sender)
        elif cmd_functor == 'putdown':
            if cmd.args[1].get_type() == pedroclient.PObject.inttype:
                self.putdown_on_block(cmd.args[0].val, cmd.args[1].val, 
                                      sender)
            else:
                self.putdown_on_table(cmd.args[0].val, cmd.args[1].val, 
                                      sender)
        elif cmd_functor == 'go_home':
             self.go_home(cmd.args[0].val)

编辑:抱歉还有很多代码,我已经尽可能地略读了。

def process_msg(self, term):
    msg = term.args[2]
    sender_process = term.args[1].args[0].args[1].val
    robotID = int(sender_process[-1])-1
    #print msg
    if str(msg) == "initialise_":
        robotID = int(sender_process[-1])-1

def data_cb(self, event):
    self.env.process_msg(event.notification)

我能理解的最好的就是functor是msg的一个属性,又是系统输入的参数,其中系统输入是一个事件通知。我是正确的还是完全走错了方向。

【问题讨论】:

  • 这段代码有部分缺失,不是吗? msg的定义在哪里?你向这个函数传递了什么?
  • functor = msg.functor 告诉你functor 是对象msg 的一个属性。接下来你要做的就是找出msg 是什么。
  • 干杯,是的,缺少代码,谢谢你们。

标签: python functor


【解决方案1】:

基本的东西 - msg & functor 可能在这些地方:

  • 在此文件中定义
  • 在由该文件顶部的 import 语句导入的本地模块中,这将是应用目录结构中的 .py 文件
  • 在其他人安装的包中

.val - 这很可能是一个包含数据的属性。它不是我能找到的任何类型的 Python 关键字。我确定您认为它可能是“价值”的缩写。它要么在它所属的对象中定义 (functor, cmd.args[]),要么在它们导入并因此继承 val 的某些高级对象中定义。

【讨论】:

  • 谢谢,我应该想到它可能是从不同的模块导入的,因为我正在导入它们。
【解决方案2】:

通过 Google 搜索我找到了文档,这可能会解释您的部分内容: The Pedro 1.6 Reference Manual

关于functor,我没有找到关于那个的(但没有花太多时间在上面)。 Pedro 很可能被用作向某些(真实或虚拟)机器人发送命令的消息传递系统。机器人由消息控制,消息具有某种结构,包括函子,可能是对应该执行哪种类型的动作的标识,以及值,它们是定义该动作的参数。

【讨论】:

  • 谢谢参考,还是有点迷糊。
【解决方案3】:

由于 Python 允许将函数作为值传递,因此 Functor 基本上是一个对象,它是一个函数。请注意,在您发布的代码中,您多次比较了哪个函数。

cmd_type = functor.val 行上,您实际上将函数本身归因于 cmd_type,然后您比较它以了解它到底是哪个函数。

if cmd_type == 'stop_':
是函数stop()吗?

elif cmd_type in ['start_', 'mod_']:
是这些函数之一,start(),mod()?

等等……延伸阅读here

编辑:我发现this这个话题与理解函子的概念非常相关,虽然它没有引用python,但python有很多函数式编程特性。

【讨论】:

  • 谢谢,它开始变得有意义了。
【解决方案4】:

functormsg 对象的一个​​属性;如果没有看到该对象的定义,我们无法告诉您更多信息。同样,val 又是msg 的一个属性。

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多