Как использовать две вспомогательные функции в основном скрипте из другого скрипта
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()
Если это так, то это основные проблемы:
- Python проходит
self
а такжеj
вMyClass._slow_trap_ramp
, но вы только определили это, чтобы принятьself
(отмечено выше), - вы используете методы класса из
KeysightB2962A
а такжеFraunhoferAveraging
непосредственно вместо создания экземпляра класса и использования методов экземпляра, и - вы возвращаете ссылки на методы вместо вызова методов.
Вы можете исправить все это, изменив код так, чтобы он выглядел следующим образом (см. Встроенные комментарии):
Новая версия 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()