Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Explicit function calling via () is one of my favorite things in the language. To each their own.

"exit" merely references a function. It doesn't call by name alone. It can thus be passed to a function (a callback for example), saved to a variable, etc for later calling. Maybe not so useful for the exit function in the interactive shell but very useful for functional programming. This is an example of consistency, sometimes at the expense of convenience; not great for hacking, awesome for collaboration and large projects (imo).

>>> dir(exit)

['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'name']

(pardon the dunderware)

Here's another way to exit the interactive shell ;)

>>> exit.__call__()



But how does "exit" by itself print that pretty little message telling you that, although it's obvious you wanted to exit, it's not going to let you? It's not just a function reference if it shows up that way.


http://docs.python.org/library/constants.html#exit

In CPython, exit is actually an object of type site.Quitter (the actual class is implementation dependent). site.Quitter overrides the __repr__ special method (which is called by the interpreter on any expression typed in the shell to print the result). site.Quitter also overrides the __call__ special method, so when an object of type site.Quitter is called, the overridden __call__ method invokes system exit.

   >>> exit_class = type(exit) #gets a reference to the class
   >>> my_exit = exit_class('bye') #the arg is used to print the message
   >>> my_exit
   Use bye() or Ctrl-D (i.e. EOF) to exit
   >>> my_exit()
   <python shell exits>
Minor inconsistency: typing "bye()" doesn't work so technically the message is incorrect. But I suppose they don't want you to be hacking exit() in the first place.


  >>> class ExitFunc:
  ...   def __call__(self): __builtins__.exit()
  ...   def __repr__(self): return "That's how!"
  ...
  >>> exit = ExitFunc()
  >>> exit
  That's how!
  >>> exit()


"exit" merely references a function. It doesn't call by name alone.

His point was that the user already typed in "exit", and the interpreter recognized the user's intent to exit, so it should just shut up and exit already, instead of telling the user to exit in a different way.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: