2014-12-02 4 views
0

Мне было просто любопытно, что использование промывки будет в данном конкретном случае, поскольку оно не влияет на то, работает ли мое приложение или нет. Линия, о которой идет речь, относится к определению маршрута 2-го класса, строке «sys.stdout.flush()». Для чего это будет использоваться?Что такое промывка в этом случае?

class Route(object): 
    def __init__(self): 
     self.__route = [] #route information array 

    def add_route(self, t): #user generated input array 
     self.__route.append(t) 
     print t.name 
     sys.stdout.flush() #using "flush" method 

    def compile_list(self): #route list compiler 
     output = "" #sets addition variable 
     for route in self.__route: #looping inputs 
      output += "<div id='container'><div class='results-container'><span class='title'>Route name: </span>" + "<span class='result'>" + route.name + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop One: </span>" + "<span class='result'>" + route.stop_one + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop One Mileage: </span>" + "<span class='results-container'>" + route.stop_one_mileage + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Two: </span>" + "<span class='results-container'>" + route.stop_two + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Two: </span>" + "<span class='results-container'>" + route.stop_two_mileage + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Three: </span>" + "<span class='results-container'>" + route.stop_three + "</span></div><br />" + "<div class='results-container'><span class='title'>Stop Three: </span>" + "<span class='results-container'>" + route.stop_three_mileage + "</span></div><br />" 
     return output #output return 

#===================== Calculates the average of all three ========================== 

    def calc_average(self): #average calculation 
     stop_one_mileage = self.__route[0].stop_one_mileage #stop_one_mileage average 
     stop_two_mileage = self.__route[0].stop_two_mileage #stop_two_mileage 
     stop_three_mileage = self.__route[0].stop_three_mileage #stop_three_mileage 
     avg = (int(stop_one_mileage) + int(stop_two_mileage) + int(stop_three_mileage))/3 #adds all three and divides by three 
     return "<div class='results-container'><span class='title'>Average Mileage: </span><span class='results-container'>" + str(avg) + " miles</span></div>" #returns results 


#===================== Calculates total of all three ========================== 

    def calc_total(self): #calculates the total of all three 
     stop_one_mileage = self.__route[0].stop_one_mileage #stop_one_mileage 
     stop_two_mileage = self.__route[0].stop_two_mileage #stop_two_mileage 
     stop_three_mileage = self.__route[0].stop_three_mileage #stop_three_mileage 
     total = int(stop_one_mileage) + int(stop_two_mileage) + int(stop_three_mileage) #sets total of all three input 
     return "<div class='results-container'><span class='title'>Total Mileage: </span><span class='results-container'>" + str(total) + " miles</span></div>" + "</div>" #returns results 

class FormData(object): #form data object 
    def __init__(self): 
     self.name = "" 
     self.stop_one = "" 
     self.__stop_one_mileage = "" #makes sure mileage isn't zero 
     self.stop_two = "" 
     self.stop_two_mileage = "" #makes sure mileage isn't zero 
     self.stop_three = "" 
     self.stop_three_mileage = "" #makes sure mileage isn't zero 

#===================== Getter/Setter ========================== 

     @property #stop_one_mileage getter 
     def stop_one_mileage(self): 
      return self.__stop_one_mileage #returns the stop_one_mileage 

     @stop_one_mileage.setter #stop_one_mileage setter 
     def stop_one_mileage(self, m): 
      if m <= 0: 
       self.__stop_one_mileage = 10 #mileage set to 10 (nice round number) 
      else: 
       self.__stop_one_mileage = m #returns a value as long as the input is more than zero 

ответ

0

Flush гарантирует, что выход должен быть записан на стандартный вывод сразу же, в то время как если вы не смывать, то он мощь (потенциально) задерживаются в буфере в течение неопределенного времени.

Точно, будет ли строка оставаться, зависит от устройства вывода. Некоторые устройства вывода буферизируются по строке, поэтому print с новой строкой автоматически очистят буфер. Но это не так в целом, поэтому флеш гарантирует, что он выписан независимо.

Для вашего конкретного случая, независимо от того, полезно ли это, зависит ли вас от того, может ли печать не вступить в силу немедленно. Без явного флеша в худшем случае выход может не отображаться до тех пор, пока программа не завершится. Если ваша программа немедленно завершится без вмешательства пользователя, то флеш не будет иметь никакого значения.

+0

Хорошо, это имеет смысл для меня. Похоже, что это будет более полезная функция для проекта в большем масштабе, чем у меня. Может быть, для какой-то игры, где временное отставание могло бы/было бы проблемой. Или, может быть, гораздо больший масштаб, например, Amazon или, возможно, даже YouTube, где люди могут расшатываться, если что-то занимает больше миллисекунды. Большое вам спасибо @ Rufflewind Я ценю подробный ответ вроде этого. Кроме того, спасибо вамре. –

0

Он заставляет полностью записывать буфер ввода-вывода в стандартный вывод. Это может быть важно в случае нечетных условий гонки (где точное время записи в буфер) или преждевременное прекращение (где без промывки, вся информация в буфере будет потеряна), среди других ситуаций.

Дополнительная информация

Usage of sys.stdout.flush() method

https://en.wikipedia.org/wiki/Data_buffer

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