The "loop and a half"

bartc bc at freeuk.com
Thu Oct 5 20:08:11 EDT 2017


On 05/10/2017 23:42, Gregory Ewing wrote:
> bartc wrote:
>> It can be done with an in-band end-of-data code,
> 
> Then you need some way of escaping that in-band code, in case
> it happens to equal some of the data you want to sort.

It needn't be a big deal. You can do this (you have to in Python as the 
normal 255 character signifying eof on a character stream is trapped):

  EOD=chr(26)      # can be anything that is an unlikely input line.

  def myinput(prompt):
      try:
          return input(prompt)
      except EOFError:
          return EOD

Then you can keep using a simple type of loop without worrying about EOF 
status:

  print ("Type Ctrl-Z on its own line to finish.") # Windows

  while 1:

      buffer=myinput("Enter something: ")
      if buffer==EOD: break
      print ("You typed:",buffer)     # process(buffer)

  print ("Bye")

>> Yes, I tried typing 'sort' in Linux, where it apparently hangs (same 
>> on Windows actually). The reason: because it might have killed someone 
>> to have added a message saying what you are expected to type and how 
>> to end it. (Namely, press Ctrl-D start at the start of a line in 
>> Linux, and Ctrl-Z followed by Enter, I think also at the start, in 
>> Windows.)
> 
> How to signal EOF from the keyboard is a fundamental piece
> of knowledge about the OS. It's not the responsibility of
> individual programs to teach it to you, any more than it's
> your car's responsibility to explain what the steering wheel
> does each time you start the engine.

If you have a utility that is designed to also be used interactively, 
but it shows absolutely nothing when you start it, like this:

  >sort





then it stinks. You wouldn't think much of a shell prompt that literally 
showed nothing at all instead of something like:

  c:\python39>

How would you even know what program you were in the middle of after the 
initial command has scrolled off the screen? How would you now it was 
still running? As typing a line into it give no response.

I don't run these things often enough to remember exactly how to specify 
an EOF with the keyboard. It might be:

- One of Ctrl C, D, Z or Break

- It may or not may not only work at the start of a line

- It may or not require to be followed by Enter

I anyway would never inflict such an interface on my users, who would 
also associate Ctrl C etc with aborting a program that's gone wrong.

-- 
bartc



More information about the Python-list mailing list