2014-10-06 3 views
1

Я искал в Интернете ответы на многие ответы, связанные с TypeError, и несколько раз проверял мой код, но я не могу понять, что является третьим аргументом, который мне не хватает. Я использую Python 2.7 с Simpy 3Тип Ошибка - Python Simpy

Мой код выглядит следующим образом:

import simpy 
    import random 

    RANDOM_SEED = 42 
    NUM_SERVERS = 1 
    MTBF = 10 
    MTTR = 5 
    TOTAL_ENGINES = 6 
    TOTAL_SPARES = 3 
    TOTAL_IN_USE = TOTAL_ENGINES - TOTAL_SPARES 
    SIM_TIME = 100 

    class Working(object): 

     def __init__ (self, env, num, repair_facility, spares_inventory, downtime): 
      self.env = env 
      self.repair_facility = repair_facility 
      self.spares_inventory = spares_inventory 
      self.downtime = downtime 
      self.name = 'Engine %d' % (num + 1) 
      print('%s at %.2f' % (self.name, self.env.now)) 
      self.env.process(self.run()) 

     def run(self): 
      yield self.env.timeout(random.expovariate(1.0/MTBF)) 
      print('%s at %.2f' % (self.name, self.env.now)) 

      downtime_start = self.env.now 
      spare = yield self.spares_inventory.get() 
      self.downtime.append(self.env.now - downtime_start) 

      print('%s at %.2f' % (spare.name, self.env.now)) 
      print('%d' % len(spares_inventory.items)) 

      with self.repair_facility.request() as req: 
       yield req 
       print('%s begins repair at %.2f' % (self.name, self.env.now)) 

       yield self.env.timeout(random.expovariate(1.0/MTTR)) 

       yield self.spares_inventory.put(self) 
       print('%s at %.2f' % (self.name, self.env.now)) 

      print('%d' % len(spares_inventory.items)) 

    def main(): 
     env = simpy.Environment() 
     repair_facility = simpy.Resource(env, capacity = NUM_SERVERS) 
     spares_inventory = simpy.Container(env, capacity = TOTAL_ENGINES, init = TOTAL_SPARES) 
     downtime = [] 
     working = [Working(env, i, repair_facility, spares_inventory, downtime) for i in range(TOTAL_IN_USE)] 

     env.run(SIM_TIME) 

    if __name__ == '__main__': 
     main() 

Это ошибка, я получаю:

Traceback (самый последний вызов последнего):

 File "", line 61, in <module> 
     main() 
     File "", line 55, in main 
     env.run(SIM_TIME) 
     File "", line 120, in run 
     self.step() 
     File "", line 213, in step 
     raise event._value 
     TypeError: __init__() takes exactly 3 arguments (2 given) 

Любая помощь вообще очень ценится, спасибо много заранее

ответ

2

Вы забыли немного дополнительного информация в вашей трассе; выше вашего цитированного отрывка, есть несколько строк, которые говорят:

Traceback (most recent call last): 
    File "/data/evertr/sw/lib/python2.7/site-packages/simpy/events.py", line 312, in _resume 
    event = self._generator.send(event._value) 
    File "simptest.py", line 31, in run 
    spare = yield self.spares_inventory.get() 
TypeError: __init__() takes exactly 3 arguments (2 given) 

The above exception was the direct cause of the following exception: 

, а затем ваш след.

С этим вы можете видеть, что звонок self.spares_inventory.get() является настоящим преступником. Довольно раздражающе, этот метод на самом деле представляет собой скрытый экземпляр класса (много явных вещей, происходящих за кулисами в simpy, я заметил), и именно поэтому вы видите предупреждение __init__().

В принципе, вам необходимо поставить amount в self.spares_inventory.get() (есть, к лучшему или худшему, нет удобного дефолта 1).

Так меняется, что

spare = yield self.spares_inventory.get(1) 

может решить вашу проблему.

(После этого вы столкнетесь с другими ошибками: вы обнаружите, что эти новые ошибки следуют одной и той же структуре: трассировка, а затем строка The above exception was the direct cause of the following exception, а затем другая (менее релевантная) трассировка).

Смежные вопросы