I’m creating a shell-like environment. My original method of handleing user input was to use a dictionary mapping commands (strings) to methods of various classes, making use of the fact that functions are first class objects in python.
For flexibility’s sake (mostly for parsing commands), I’m thinking of changing my setup such that I’m using getattr(command), to grab the method I need and then passing arguments to it at the end of my parser. Another advantage of this approach is not having to update my (currently statically implemented) command dictionary every time I add a new method/command.
My question is two fold. First, does getattr have the same problems as eval? Second, will I be taking a hit to the efficiency of my shell? Does it matter how many methods/commands I have? I’m currently looking at 30 some commands, which could eventually double.
The difference between direct attribute access and using getattr() should be fairly negligible. You can tell the difference between the two versions’ bytecodes by using Python’s
dismodule to compare the two approaches:It does, however, sound like you are developing a shell that is very similar to how the Python library
cmddoes command line shells.cmdlets you create shells that executes commands by matching the command name to a function defined on acmd.Cmdobject like so:You can read more about the module at either the documentation, or at http://www.doughellmann.com/PyMOTW/cmd/index.html