Как использовать две вспомогательные функции в основном скрипте из другого скрипта

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

2 ответа

Ошибка проста.

ramp = self._slow_trap_ramp(j)

Вы вызываете этот метод с аргументом j, но метод не принимает аргумент (кроме self, который используется для передачи объекта).

Переопределите ваш метод для принятия аргумента, если вы хотите передать его один:

def _slow_trap_ramp(self, j):

Похоже, что ваш экстракт кода содержит методы некоторого класса, полное определение которого не показано, и вы вызываете один метод из другого метода (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):
        ...

Текущая версия main.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 проходит self а также j в MyClass._slow_trap_ramp, но вы только определили это, чтобы принять self (отмечено выше),
  2. вы используете методы класса из KeysightB2962A а также FraunhoferAveraging непосредственно вместо создания экземпляра класса и использования методов экземпляра, и
  3. вы возвращаете ссылки на методы вместо вызова методов.

Вы можете исправить все это, изменив код так, чтобы он выглядел следующим образом (см. Встроенные комментарии):

Новая версия 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()
Другие вопросы по тегам