2015-06-16 3 views
0

Я всегда получаю тип ошибки, когда я запускаю следующий код питона (abc.py) следующим образом:ошибка типа в программе питона

./abc.py activatelink alphabeta 
Type Error: ['alphabeta'] 

Мой код:

#!/usr/bin/python 

import urllib2 
from urllib2 import URLError 
from urllib2 import HTTPError 
import requests 
import urllib 
import json 
import time 
import os 
import sys 
import hashlib 


def activate_user(link): 
     print invoke_rest('GET', link) 

def invoke_rest(request_type, rest_url, payload, headers): 
     try: 
       api_url = rest_url 
       if request_type == 'GET': 
         r = requests.get(api_url) 
         to_ret = {'code':r.status_code, 'reply':r.text} 
         return to_ret 
       elif request_type == 'POST': 
         r = requests.post(api_url, data=payload, headers=headers) 
         to_ret = {'code':r.status_code, 'reply':r.text} 
         return to_ret 
       else: 
         return "Invalid request type ", request_type 
     except Exception, e: 
       return "Exception:", e, " in getting the API call" 

def help(): 
    print ('Usage: %s { activate | help }', os.path.basename(sys.argv[0]) 

if __name__ == '__main__': 
    actions = {'activatelink': activate_user, 'help': help} 
    try: 
     action = str(sys.argv[1]) 
    except IndexError: 
     print "IndexError: ", sys.argv[1] 
     action = 'help' 
    args = sys.argv[2:] 
    try: 
     actions[action](*args) 
    except (KeyError): 
     print "Key Error:", args 
     help() 
    except (TypeError): 
     print "Type Error:", args 
     help() 

я делаю что-нибудь неправильно? Я добавил некоторые другие функции, кроме activatelink, которые отлично работают, может ли кто-нибудь указать, что здесь не так?

+2

Обеспечить полную трассировку стека исключений, пожалуйста. –

+5

Можете ли вы * удалить * обработчики исключений в своем коде, чтобы мы могли видеть полное полное исключение с трассировкой, а не сообщение 'print'? –

ответ

6

Ваш invoke_rest() функция принимает четыре аргументы:

def invoke_rest(request_type, rest_url, payload, headers): 

но вы передаете только в двух:

print invoke_rest('GET', link) 

Это вызывает TypeError исключение:

>>> def invoke_rest(request_type, rest_url, payload, headers): 
...  pass 
... 
>>> invoke_rest('GET', 'alphabeta') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: invoke_rest() takes exactly 4 arguments (2 given) 

Возможно, вам хотел этих двух дополнительных аргументов nts (payload и headers). Если да, то их аргументы ключевых слов и установить их значение по умолчанию None:

def invoke_rest(request_type, rest_url, payload=None, headers=None): 

который прекрасен в requests библиотеке.

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