2017-02-21 12 views
0

Я пытаюсь написать свою собственную оболочку в Python с помощью модуля cmd, и я не знаю, как решить свою проблему даже после чтения hundreads тем в Интернете.Передача аргументов методу с модулем cmd

def do_triangle_area(a, h): 
    "Calculating tiangle's field" 
    print (1/2*a)*h 

Я просто хочу, чтобы передать «а» и «з» аргументы через командную строку, запустив программу, и когда я печатаю

$ tiangle_area 5 2 

Он должен вернуть мне результат, но есть ошибка:

Traceback (most recent call last): 
    File "test8.py", line 75, in <module> 
    CMD().cmdloop() 
    File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop 
    stop = self.onecmd(line) 
    File "/usr/lib/python2.7/cmd.py", line 221, in onecmd 
    return func(arg) 
    File "test8.py", line 17, in do_triangle_area 
    print (a*b) 
TypeError: object cannot be interpreted as an index 

Я пытался добавить Самости рассуждение

def do_triangle_area(self, a, h): 
     "Calculating tiangle's field" 
     print (1/2*a)*h 

Но это не работает слишком:

Traceback (most recent call last): 
    File "test8.py", line 75, in <module> 
    CMD().cmdloop() 
    File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop 
    stop = self.onecmd(line) 
    File "/usr/lib/python2.7/cmd.py", line 221, in onecmd 
    return func(arg) 
TypeError: do_triangle_area() takes exactly 3 arguments (2 given) 

Все в одном классе, УМК модуль импорта. Все хорошо, когда это один аргумент - проверен, работает блестяще, но потом он ничего не может вычислить для меня. Но почему он не может обрабатывать более одного аргумента от пользователя? Как это работает?

Что я могу сделать в этой ситуации? Дайте мне какие-то намеки, пожалуйста, потому что я стучал головой о стену ...

EDIT: Всего код http://pastebin.com/3EVBbvfN EDIT2: Paste истек - новая паста: http://pastebin.com/3wM021s1

+0

Включить код для 'Защиту onecmd' или где вы разобрать строку – TemporalWolf

+0

[http://pastebin.com/3EVBbvfN] Я не знаю, что вы просите, чтобы я 'm, включая весь код –

+0

Пожалуйста, кто-нибудь может мне помочь? –

ответ

0

Когда вы не понимаете, что происходит, просто добавьте следы.

def do_triangle_area(a, h): 
     "Calculating tiangle's field" 
     print(a, type(a), h, type(h)) 
     print (1/2*a)*h 

показал бы что-то вроде:

<__main__.CMD object at 0x...> <class '__main__.CMD'> 2 4 <class 'str'> 

Теперь очевидно, что do_triangle_area принимает 2 аргумента, объект Cmd как я и одну строку, содержащую оставшуюся часть команды. Таким образом, вы должны написать:

def do_triangle(self, line): 
    "Calculating tiangle's field" 
    # print(self, type(self), line, type(line)) uncomment for debug 
    a,h = [float(s) for s in line.split()] 
    print (1/2*a)*h