timeit

Програмиране с Python

Курс във Факултета по Математика и Информатика към СУ

Пета задача

  1. Може да се насладите на великолепното условие на пета задача. Срокът да ни смаете с решенията си е 18.05 17:00.

    Кратък примерен тест можете да намерите в GitHub хранилището.

    Добра идея е покрай всяко домашно да си припомняте отново как (не) се предават задачи.

  2. def identation_error():
        if true:
            eight spaces here
          six spaces here
    

    В този случай при добавяне на грешка за индентация на ред 4, трябва да върнем:

     'indentation is 6 instead of 4'  
    

    или:

     'indentation is 6 instead of 8'   
    

    Като цяло в такива ситуации трябва да връщаме правилната индентация или базовата дадена ни от rules?

  3. Трябва ли да очакваме хората писали кода, който ще проверява нашата функция, да са постоянни
    в грешките си при индентацията? Например може ли да има такъв случай:

    def ast_parse_fail(indent=unconsistent):  
        indent = 4
         indent = 5
        indent = 4
    

    Тъй като, ако това може да се случва то няма как да използваме AST, тъй като
    ast.parse(...) гърми...

  4. max_nesting=None - максималното ниво на влагане

    На кой/кои ред/редове трябва да слагаме грешката? Например в следния код с max_nesting=3:

    def some_func(val):
        for char in val:
            if char != 'a':
                for _ in range(10):
                    print('SOOOO MUUUCH INDENTATION')
                    print('more stuff')
                    if char != 'b':
                        print('Even more nesting')
    

    indentation_size=4 - брой <Space> символи, с които трябва да са индентирани блоковете код

    Има ли случаи, в които вместо спейсове са ползвани табове и каква грешка да дадем ако има?

    max_arity=None - максимален брой аргументи на функции/методи.

    Ламбда функциите броят ли се? *args и **kwargs като аргументи ли да ги броим?

    max_lines_per_function=None - максимален брой логически редове в тялото на функция/метод.

    Колко са логическите редове в този код:

    def example(val):
        """Some example docstring
    
           test
        """
        if val:
            return True
        else:
            return False
    

    Реда с def-а брои ли се?

  5. За max_nesting класовете броят ли се за +1 или гледаме само функциите?

    В условието пише, че следният код има 4 нива на влагания:

    def some_func():
        a_variable = 'some text'; another_variable = 'some more text'; even_moar_variables = 'just for to pass the time'
        for char in a_variable:
            if char != 'a':
                for _ in range(10):
                    print('SOOOO MUUUCH INDENTATION')
    

    Тогава

    class A:
        def some_func():
                a_variable = 'some text'; another_variable = 'some more text'; even_moar_variables = 'just for to pass the time'
                for char in a_variable:
                    if char != 'a':
                        for _ in range(10):
                            print('SOOOO MUUUCH INDENTATION')
    

    5 или 4 нива на влагания ще има?

    Също така може ли да има вложени функции в други функции? И ако да - и те тогава ще се броят за +1 влагане, нали? (а за methods_per_class вложените броят ли се?)

    too many methods in class
    

    За тази грешка кой ред трябва да сложим в речника?

  6. @Георги, според мен е доста логично класовете и вложените функции да увеличават индентацията.

    def identation_error():
          if True: # 6 spaces
            return False  # 6 + 2 spaces
    

    Реда на if-а трябва да е с грешна индентация при indentation_size=4. Ами реда на return? Вложен е два пъти и тогава би трябвало да е 8, което е правилно, но спрямо if-а е вложен само с 2 интервала. Това трябва ли да се брои за грешка?

  7. Вчера Евгени каза, че вложението се смята локално за всяка функция, а не глобално в целия файл, което означава, че класовете би трябвало да не допринасят към вложението. Ами тогава какво става в този пример:

    def master():
        def some_func():
            a_variable = 'some text'
            for char in a_variable:
                if char != 'a':
                    for _ in range(10):
                        print('SOOOO MUUUCH INDENTATION')
    

    За some_func нивата са 4, но за master - 5. Тогава при максимално влагане 3 какво трябва да има в речника за ред 7? 4, 5, или и двете? Трябва ли за ред 6 да има 4?

  8. Аз доколкото разбрах телата на вложените функции не се броят при влагането на външната функция. Тоест в случая най-голямото влагане на master е 1, на първия ред (def some_func()), а на some_func() - 4.

    Не гарантирам обаче.

  9. Малко е късно, но в задачата едните примери са: ' ({} > {})' другите '({} > {})' т.е. без whitespace. В момента съм копирала "шаблоните" 1:1 от задачката. Надявам се после да няма изненади.

    ПП. никой не отговори как се броят редовете на функция (вкл. с def или не)

Трябва да сте влезли в системата, за да може да отговаряте на теми.