Re: avoid the redefinition of a function

Discussion in 'Python' started by Jabba Laci, Sep 12, 2012.

  1. Jabba Laci

    Jabba Laci Guest

    > For example:
    >
    > def install_java():
    > pass
    >
    > def install_tomcat():
    > pass


    Thanks for the answers. I decided to use numbers in the name of the
    functions to facilitate function calls. Now if you have this menu
    option for instance:

    (5) install mc

    You can type just "5" as user input and step_5() is called
    automatically. If I use descriptive names like install_java() then
    selecting a menu point would be more difficult. And I don't want users
    to type "java", I want to stick to simple numbers.

    Laszlo
     
    Jabba Laci, Sep 12, 2012
    #1
    1. Advertising

  2. Jabba Laci

    MRAB Guest

    On 12/09/2012 19:04, Alister wrote:
    > On Wed, 12 Sep 2012 18:56:46 +0200, Jabba Laci wrote:
    >
    >>> For example:
    >>>
    >>> def install_java():
    >>> pass
    >>>
    >>> def install_tomcat():
    >>> pass

    >>
    >> Thanks for the answers. I decided to use numbers in the name of the
    >> functions to facilitate function calls. Now if you have this menu option
    >> for instance:
    >>
    >> (5) install mc
    >>
    >> You can type just "5" as user input and step_5() is called
    >> automatically. If I use descriptive names like install_java() then
    >> selecting a menu point would be more difficult. And I don't want users
    >> to type "java", I want to stick to simple numbers.
    >>
    >> Laszlo

    >
    > No No NO!
    > you cant just pass user input to system calls without validating it first
    > (google sql injection for examples of the damage unsanitised input can
    > cause, it is not just as SQL problem)
    >
    > it is just as easy so select a reasonably named function as a bad one
    >
    > option=raw_input('select your option :')
    >
    > if option =="1": install_java()
    > if option =="2": install_other()
    >
    > alternatively you cold add your functions into a dictionary an call them
    > from that
    >
    > opts={'1':install java,'2':install_other}
    >
    > option=raw_input('select your option :')
    > opts[option]
    >
    > Poorly named functions are a major example of poor programming style.
    >
    > one of the fundamental pillars for python is readability!
    >

    Or you could do this:


    def install_java():
    "Install Java"
    print "Installing Java"

    def install_tomcat():
    "Install Tomcat"
    print "Installing Tomcat"

    menu = [install_java, install_tomcat]

    for index, func in enumerate(menu, start=1):
    print "{0}) {1}".format(index, func.__doc__)

    option = raw_input("Select your option : ")

    try:
    opt = int(option)
    except ValueError:
    print "Not a valid option"
    else:
    if 1 <= opt < len(menu):
    menu[opt - 1]()
    else:
    print "Not a valid option"
     
    MRAB, Sep 12, 2012
    #2
    1. Advertising

  3. Jabba Laci

    D'Arcy Cain Guest

    On Wed, 12 Sep 2012 18:04:51 GMT
    Alister <> wrote:
    > No No NO!
    > you cant just pass user input to system calls without validating it first
    > (google sql injection for examples of the damage unsanitised input can
    > cause, it is not just as SQL problem)


    http://xkcd.com/327/

    --
    D'Arcy J.M. Cain <> | Democracy is three wolves
    http://www.druid.net/darcy/ | and a sheep voting on
    +1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.
    IM:
     
    D'Arcy Cain, Sep 12, 2012
    #3
  4. Jabba Laci

    Peter Otten Guest

    MRAB wrote:

    > On 12/09/2012 19:04, Alister wrote:
    >> On Wed, 12 Sep 2012 18:56:46 +0200, Jabba Laci wrote:
    >>
    >>>> For example:
    >>>>
    >>>> def install_java():
    >>>> pass
    >>>>
    >>>> def install_tomcat():
    >>>> pass
    >>>
    >>> Thanks for the answers. I decided to use numbers in the name of the
    >>> functions to facilitate function calls. Now if you have this menu option
    >>> for instance:
    >>>
    >>> (5) install mc
    >>>
    >>> You can type just "5" as user input and step_5() is called
    >>> automatically. If I use descriptive names like install_java() then
    >>> selecting a menu point would be more difficult. And I don't want users
    >>> to type "java", I want to stick to simple numbers.
    >>>
    >>> Laszlo

    >>
    >> No No NO!
    >> you cant just pass user input to system calls without validating it first
    >> (google sql injection for examples of the damage unsanitised input can
    >> cause, it is not just as SQL problem)
    >>
    >> it is just as easy so select a reasonably named function as a bad one
    >>
    >> option=raw_input('select your option :')
    >>
    >> if option =="1": install_java()
    >> if option =="2": install_other()
    >>
    >> alternatively you cold add your functions into a dictionary an call them
    >> from that
    >>
    >> opts={'1':install java,'2':install_other}
    >>
    >> option=raw_input('select your option :')
    >> opts[option]
    >>
    >> Poorly named functions are a major example of poor programming style.
    >>
    >> one of the fundamental pillars for python is readability!
    >>

    > Or you could do this:
    >
    >
    > def install_java():
    > "Install Java"
    > print "Installing Java"
    >
    > def install_tomcat():
    > "Install Tomcat"
    > print "Installing Tomcat"
    >
    > menu = [install_java, install_tomcat]
    >
    > for index, func in enumerate(menu, start=1):
    > print "{0}) {1}".format(index, func.__doc__)
    >
    > option = raw_input("Select your option : ")
    >
    > try:
    > opt = int(option)
    > except ValueError:
    > print "Not a valid option"
    > else:
    > if 1 <= opt < len(menu):
    > menu[opt - 1]()
    > else:
    > print "Not a valid option"


    I'd still argue that a function index is the wrong approach. You can use tab
    completion to make entering descriptive names more convenient:

    import cmd

    class Cmd(cmd.Cmd):
    prompt = "Enter a command (? for help): "

    def do_EOF(self, args):
    return True
    def do_quit(self, args):
    return True

    @classmethod
    def install_command(class_, f):
    def wrapped(self, arg):
    if arg:
    print "Discarding argument {!r}".format(arg)
    return f()

    wrapped.__doc__ = f.__doc__
    wrapped.__name__ = f.__name__
    class_._add_method("do_" + f.__name__, wrapped)
    return f

    @classmethod
    def _add_method(class_, methodname, method):
    if hasattr(class_, methodname):
    raise ValueError("Duplicate command {!r}".format(methodname))
    setattr(class_, methodname, method)

    command = Cmd.install_command

    @command
    def install_java():
    "Install Java"
    print "Installing Java"

    @command
    def install_tomcat():
    "Install Tomcat"
    print "Installing Tomcat"

    if __name__ == "__main__":
    Cmd().cmdloop()
     
    Peter Otten, Sep 13, 2012
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jabba Laci

    avoid the redefinition of a function

    Jabba Laci, Sep 12, 2012, in forum: Python
    Replies:
    2
    Views:
    194
    Ramchandra Apte
    Sep 12, 2012
  2. D'Arcy Cain
    Replies:
    0
    Views:
    188
    D'Arcy Cain
    Sep 12, 2012
  3. Michael Torrie

    Re: avoid the redefinition of a function

    Michael Torrie, Sep 12, 2012, in forum: Python
    Replies:
    0
    Views:
    190
    Michael Torrie
    Sep 12, 2012
  4. Tim Chase
    Replies:
    0
    Views:
    179
    Tim Chase
    Sep 12, 2012
  5. Terry Reedy
    Replies:
    0
    Views:
    187
    Terry Reedy
    Sep 12, 2012
Loading...

Share This Page