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 u
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 dis
module to compare the two approaches:
>>> import dis
>>> dis.dis(lambda x: x.foo)
1 0 LOAD_FAST 0 (x)
3 LOAD_ATTR 0 (foo)
6 RETURN_VALUE
>>> dis.dis(lambda x: getattr(x, 'foo'))
1 0 LOAD_GLOBAL 0 (getattr)
3 LOAD_FAST 0 (x)
6 LOAD_CONST 0 ('foo')
9 CALL_FUNCTION 2
12 RETURN_VALUE
It does, however, sound like you are developing a shell that is very similar to how the Python library cmd
does command line shells. cmd
lets you create shells that executes commands by matching the command name to a function defined on a cmd.Cmd
object like so:
import cmd
class EchoCmd(cmd.Cmd):
"""Simple command processor example."""
def do_echo(self, line):
print line
def do_EOF(self, line):
return True
if __name__ == '__main__':
EchoCmd().cmdloop()
You can read more about the module at either the documentation, or at http://www.doughellmann.com/PyMOTW/cmd/index.html
does getattr have the same problems as eval?
No -- code using eval()
is terribly annoying to maintain, and can have serious security problems. Calling getattr(x, "foo")
is just another way to write x.foo
.
will I be taking a hit to the efficiency of my shell
It will be imperceptibly slower if the command isn't found, but not enough to matter. You'd only notice it if doing benchmarks, with tens of thousands of entries.