2016-11-03 2 views
0

Этот код продолжает давать мне ошибку:Выбор значений аргументов по умолчанию в python?

TypeError: объект «NoneType» не имеет атрибута «GetItem»

class d_exposure(object): 
    def __init__(self): 
     self.files = glob.glob('C:\files') 
    def exposure(self,level): 
     level = inspect.getargspec(d_exposure().exposure)[3][0] 
     print level 
def main(): 
    mp = d_exposure() 
    mp.exposure(level = 'MID') 

кажется, что проблема заключается в том, что он хочет, чтобы значение по умолчанию для уровня. Тем не менее, трассировка показывает, что она получает значение.

Traceback (most recent call last): 
    File "C:\Users\Documents\my_scripts\exposure.py", line 58, in <module> 
main() 
    File "C:\Users\Documents\my_scripts\exposure.py", line 54, in main 
mp.exposure(level = 'MID') 
    File "C:\Users\Documents\my_scripts\exposure.py", line 17, in exposure 
level = inspect.getargspec(d_exposure().exposure)[3][0] 

Когда я пытаюсь дать ему значение по умолчанию «DIM», то выход есть «DIM», хотя звонок я сделал был mp.exposure (уровень = «MID»). Может кто-нибудь, пожалуйста, помогите мне выяснить, что я делаю неправильно?

+3

Этот код не имеет никакого смысла. Если вы передаете значение для 'level', просто используйте его напрямую. Нет никакой интроспекции. Предпочитаете ли вы путать синтаксис для передачи аргумента ключевого слова для синтаксиса, объявляющего значение аргумента по умолчанию? – Blckknght

+0

Да, это, очевидно, упрощено из всего кода, но идея в том, что я получаю сообщение об ошибке, потому что ему нужен аргумент по умолчанию для уровня, но я хочу иметь возможность вызывать функцию для разных типов «уровней» – boson

+1

Я предполагаю, что мой вопрос: зачем вы используете эту строку кода? Если вы удалите всю строку с помощью 'inspect.getargspec', я подозреваю, что она сделает то, что вы хотите. Если вы хотите, чтобы 'level' был необязательным аргументом, вы можете использовать' def exposure (self, level = "DIM"): '. – Blckknght

ответ

1
inspect.getargspec(d_exposure().exposure) 

Эта линия дает следующий результат:

ArgSpec(args=['self', 'level'], varargs=None, keywords=None,   defaults=None) 

Последняя запись в том, что его нет, на которую вы пытаетесь вызвать GetItem метод, обращаясь к 0-й элемент. Когда вы укажете default как «DIM», последнее значение в методе getargspec - [DIM], и, следовательно, оно дает вам «DIM» в качестве ответа.

Когда вы делаете это в основном методе:

mp.exposure(level = 'MID') 

вы даете MID в качестве параметра, а не значение по умолчанию. Значение по умолчанию может быть задано только во время определения функции. Вы не указали четко, что именно вы хотите сделать, поэтому я не могу дать вам информацию об этом.

+0

О, я вижу, что я не должен использовать [3] [0], потому что это соответствует аргументам по умолчанию, хорошо, что имеет смысл. Благодаря! – boson

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