2013-09-12 3 views
-3

относительно моего кода ниже (языка Python), почему следующее заявление для печати (в функции get_a_maximal_subset)Python печати Выход Выполнение из заказа

file = open("_probe","a") 
    file.write("\n new_ref_array: \n") 
    file.write(str(new_ref_array)) 
    file.close 

получить напечатанной в файл перед (в код ссылки ниже)

     file = open("_probe","a") 
         file.write("\n local_array \n") 
         file.write(str(local_array)) 
         file.close 

я получаю следующий вывод в файл _probe:

тест точка 2

контрольная точка 3

контрольная точка 3-б

контрольная точка 3-с

new_ref_array:

[10, 1]

new_ref_array:

[10 , 1]

local_array

[10, 1]

контрольная точка 4

ВОПРОС: кажется, что "локальный массив" должен быть напечатан ДО, а не после того, как "new_ref_array" линий, так как "new_ref_array" линии являются от функции get_a_maximal_array и порядок код:

     local_array = list(array[i:]) 
         file = open("_probe","a") 
         file.write("\n local_array \n") 
         file.write(str(local_array)) 
         file.close 
         i = i + 1 
         subset_candidate = get_a_maximal_subset(local_array, max, prefix) 

==================== МОЙ кОД НИЖЕ ========= ==================================

   while (determination_process == True): 
        file = open("_probe","a") 
        file.write("\n test point 2 \n") 
        file.close 
        i = 0 
        for x in array: 
         file = open("_probe","a") 
         file.write("\n test point 3 \n") 
         file.close 
         prefix = [] 
         local_process_ref = [max+1] 
         if (determination_process != True): 
          break 
         if (x not in global_process_ref): 
          file = open("_probe","a") 
          file.write("\n test point 3-b \n") 
          file.close 
          global_process_ref.append(x) 
          file = open("_probe","a") 
          file.write("\n test point 3-c \n") 
          file.close 
         local_array = list(array[i:]) 
         file = open("_probe","a") 
         file.write("\n local_array \n") 
         file.write(str(local_array)) 
         file.close 
         i = i + 1 
         subset_candidate = get_a_maximal_subset(local_array, max, prefix) 
         file = open("_probe","a") 
         file.write("\n test point 4 \n") 
         file.close 
+0

Я не» В любом месте вашего кода вы можете видеть какие-либо утверждения 'print'. – abarnert

ответ

3

Вы не закрывает файл, когда вы это делаете:

file.close 

Вы просто ссылаясь на близкий метод в качестве значения. То, что вы хотели, чтобы вызова близкого метод:

file.close() 

В конце концов, файл получает сборку мусора, после чего все его забуференных данных получает продуваемое. Но пока вы открыли тот же файл в другом месте и добавили к нему новые данные.

На многих платформах ваши левые буферы в конечном итоге перезаписывают более поздние данные, вместо того, чтобы добавлять их после них, что еще более затрудняет отладку. Тебе повезло. :)


Если вы запустили этот код через linter, он бы предупредил вас. С pylint я получаю «W0104: заявление, похоже, не имеет эффекта». Однако обратите внимание, что он не может поймать все такие ошибки.Например:

import random 
r = random.random 

Здесь вы устанавливаете r функции random, вместо того, чтобы случайное число от 0 до 1, как вы, вероятно, хотел.

От pylint не может этого знать; заявление имеет эффект, и это может быть полезным эффектом, который вы могли бы получить мог хотел. На самом деле, я нашел два примера именно это заявление оглавления источника (перефразируя немного):

def build_list(n): 
    r=random.random # only do the global lookup once instead of n times 
    return [r() for _ in range(1000000)] 

... или для гибкости (хотя это не очень хороший пример):

def build_list(n, r=None): 
    if r is None: 
     if have_urandom: 
      r = lambda: urandom.read(1) 
     except IOError: 
      r = random.random 
    return [r() for _ in range(1000000)] 
+1

Похоже на легкую ошибку. Есть ли хороший способ поймать его? Линт или что-то еще? – cbednarski

+1

@ cbednarski: Да, почти любой linter предупредит вас об этом. Например, с 'pylint', вы получите« W0104: заявление, похоже, не имеет эффекта ». – abarnert

+1

@cbednarski: Однако обратите внимание, что есть аналогичные случаи, когда linter не может догадаться, что вы имеете в виду. Например, если вы хотели бы вызвать функцию, которая возвращает что-то полезное, и оставила скобки - например, 'value = random.random' - это совершенно полезный код; он просто устанавливает значение «значение» вместо функции случайного числа. – abarnert

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