【问题标题】:How to use two helper functions in main script from another script如何在另一个脚本的主脚本中使用两个辅助函数
【发布时间】:2020-08-02 01:10:54
【问题描述】:

TypeError: _slow_trap_ramp() 接受 1 个位置参数,但给出了 2 个

def demag_chip(self):
    coil_probe_constant = float(514.5)
    field_sweep = [50 * i * (-1)**(i + 1) for i in range(20, 0, -1)] #print as list
    for j in field_sweep:
        ramp = self._slow_trap_ramp(j)

def _set_trap_ramp(self):
    set_trap_ramp = InstrumentsClass.KeysightB2962A.set_trap_ramp
    return set_trap_ramp

def _slow_trap_ramp(self):
    slow_trap_ramp = ExperimentsSubClasses.FraunhoferAveraging.slow_trap_ramp
    return slow_trap_ramp

【问题讨论】:

  • 您需要修复缩进以更好地了解正在发生的事情,以便我们为您提供更多帮助
  • 你是如何导入辅助类的?您似乎正在尝试通过文件名而不是类名来调用类。
  • 你知道如何从其他模块导入对象吗?这是你需要做的,将你的两个函数从InstrumentClass.py导入MainTests.py
  • 我已经导入了所有内容,并且我的代码已经更新,所以现在应该更清楚了,但仍然不知道为什么我会收到这个错误

标签: python


【解决方案1】:

错误很简单。

ramp = self._slow_trap_ramp(j)

您正在使用参数j 调用此方法,但该方法不带参数(self 除外,用于传递对象)。

如果要传递参数,请重新定义方法以接受参数:

def _slow_trap_ramp(self, j):

【讨论】:

  • 还有一个问题,如何使用_set_trap_ramp?这基本上是一个初始化,但我不能让它去?
  • def demag_chip(self): self._set_trap_ramp field_sweep = [50 * i * (-1)**(i + 1) for i in range(20, 0, -1)] for j在 field_sweep 中:self._slow_trap_ramp(j)
【解决方案2】:

看起来您的代码提取包含某个类的方法,其完整定义未显示,并且您正在从另一个方法调用一个方法 (self._slow_trap_ramp(j))。当您调用一个方法时,Python 会在任何其他参数之前自动传递 self。所以你需要把def _slow_trap_ramp(self)改成def _slow_trap_ramp(self, j)

根据评论更新

为了真正提供帮助,我们需要查看更多您正在编写的类,以及您正在调用的其他对象的一些信息。但是我会冒昧地猜测您的代码看起来像这样:

InstrumentsClass.py

class KeysightB2962A
    def __init__(self):
        ...
    def set_trap_ramp(self):
        ...

ExperimentsSubClasses.py

class FraunhoferAveraging
    def __init__(self):
        ...
    def slow_trap_ramp(self, j):
        ...

ma​​in.py 的当前版本

import InstrumentsClass, ExperimentsSubClasses
class MyClass
    def __init__(self)
        ...
    def demag_chip(self):
        coil_probe_constant = float(514.5)
        field_sweep = [50 * i * (-1)**(i + 1) for i in range(20, 0, -1)] #print as list
        for j in field_sweep:
            ramp = self._slow_trap_ramp(j)
    def _set_trap_ramp(self):
        set_trap_ramp = InstrumentsClass.KeysightB2962A.set_trap_ramp
        return set_trap_ramp
    def _slow_trap_ramp(self):
        slow_trap_ramp = ExperimentsSubClasses.FraunhoferAveraging.slow_trap_ramp
        return slow_trap_ramp

if __name__ == "__main__":
    my_obj = MyClass()
    my_obj.demag_chip()

如果是这样的话,那么这些是主要问题:

  1. Python 将selfj 传递给MyClass._slow_trap_ramp,但您只将其定义为接受self(如上所述),
  2. 您正在直接使用来自KeysightB2962AFraunhoferAveraging 的类方法,而不是实例化类并使用实例的方法,并且
  3. 您正在返回对方法的引用,而不是调用方法。

您可以通过将代码更改为如下所示来修复所有这些问题(请参阅嵌入式 cmets):

新版 main.py

import InstrumentsClass, ExperimentsSubClasses
class MyClass
    def __init__(self)
        # create instances of the relevant classes (note parentheses at end)
        self.keysight = InstrumentsClass.KeysightB2962A()
        self.fraun_averaging = ExperimentsSubClasses.FraunhoferAveraging()
    def demag_chip(self):
        coil_probe_constant = float(514.5)
        field_sweep = [50 * i * (-1)**(i + 1) for i in range(20, 0, -1)] #print as list
        for j in field_sweep:
            ramp = self._slow_trap_ramp(j)
    def _set_trap_ramp(self):
        # call instance method (note parentheses at end)
        return self.keysight.set_trap_ramp()
    def _slow_trap_ramp(self, j): # accept both self and j
        # call instance method (note parentheses at end)
        return self.fraun_averaging.slow_trap_ramp(j)

if __name__ == "__main__":
    my_obj = MyClass()
    my_obj.demag_chip()

【讨论】:

  • 还有一个问题,如何使用_set_trap_ramp?这基本上是一个初始化,但我不能让它去? def demag_chip(self): self._set_trap_ramp field_sweep = [50 * i * (-1)**(i + 1) for i in range(20, 0, -1)] for j in field_sweep: self._slow_trap_ramp(j )
  • 见上面的编辑。如果这不能解决您的问题,您能否提交一个最小的、完整的、可验证的示例? stackoverflow.com/help/mcve
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2012-02-06
  • 2011-01-29
相关资源
最近更新 更多