【问题标题】:Python, create a kind of template for functionsPython,为函数创建一种模板
【发布时间】:2022-09-30 18:07:39
【问题描述】:

我有一个具有三个功能的类,它们几乎做相同的事情,但在不同的对象上。而且我认为有更好的编程方法,因为它是代码的重复,但我看不出如何拥有一种模板。这是我的例子:

    def averageEndEffectorVelocity(self, samplingSize=cst.AVERAGE_SIZE):
        if len(self.eeVelocity) < samplingSize:
            return -1
        else:
            return sum(self.eeVelocity[-samplingSize:])/samplingSize

    def averageEndEffectorAcceleration(self, samplingSize=cst.AVERAGE_SIZE):
        if len(self.eeAcceleration) < samplingSize:
            return -1
        else:
            return sum(self.eeAcceleration[-samplingSize:])/samplingSize

    def averageEndEffectorJerk(self, samplingSize=cst.AVERAGE_SIZE):
        if len(self.eeJerk) < samplingSize:
            return -1
        else:
            return sum(self.eeJerk[-samplingSize:])/samplingSize

可以看到,每个函数都在计算最后一个samplingSize 速度、加速度和加加速度值的平均值。有没有办法获得更好的代码?

    标签: python function templates


    【解决方案1】:

    使这个函数完全作用于传递给它的参数(可以是类或静态方法,或者完全在类之外重构):

    def averageEndEffector(data, samplingSize=cst.AVERAGE_SIZE):
        if len(data) < samplingSize:
            return -1
        else:
            return sum(data[-samplingSize:])/samplingSize
    

    现在您的所有实例方法都可以简单地采用以下形式:

        def averageEndEffectorVelocity(self, samplingSize=cst.AVERAGE_SIZE):
            return averageEndEffector(data=self.eeVelocity, samplingSize=cst.AVERAGE_SIZE)
    

    【讨论】:

    • 哦,这真的很简单!我没想过要创建另一个函数并从其他函数调用它!谢谢!
    【解决方案2】:

    您可以像这样结合一种方法

    def averageEndEffector(self, effector, samplingSize=cst.AVERAGE_SIZE):
        value = getattr(self, effector)
        if len(value) < samplingSize:
            return -1
        else:
            return sum(value[-samplingSize:])/samplingSize
    

    效应器可以是 eeVelocity、eeAcceleration 或 eeJerk(您可以删除 'ee' 并将此前缀添加到 getattr 函数,最好使用 const)

    【讨论】:

      【解决方案3】:

      考虑一下:

      def averageEndParameter(self, whichQuantity, samplingSize=cst.AVERAGE_SIZE):
          if (whichQuantity not in ["eeVelocity", "eeAcceleration", "eeJerk"]): # List of known Parameters
              return -1
          if len(self.__getattribute__(whichQuantity)) < samplingSize:
              return -1
          else:
              return sum(self.__getattribute__(whichQuantity)[-samplingSize:])/samplingSize
      

      像这样使用它:

      averageEndParameter("eeVelocity")
      averageEndParameter("eeAcceleration")
      averageEndParameter("eJerk")
      

      您可以通过将这些项目添加到已知参数列表中来将其扩展到较新的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2016-04-06
        • 2020-01-16
        • 1970-01-01
        相关资源
        最近更新 更多