On Aug 2, 1:12 pm, "Giampaolo Rodola'" <[EMAIL PROTECTED]> wrote: > Hi, > for an FTP server I wrote I'd need to group the FTP commands in one > table that defines the command itself, the syntax string, required > permission, whether it requires authorization, whether it takes > argument and whether there's a need to validate the path from the > argument. > The more obvious way I found to do that is something like this: > > class CommandProperty: > def __init__(self, perm, auth_needed, arg_needed, check_path, > syntax): > self.perm = perm > self.auth_needed = auth_needed > self.arg_needed = arg_needed > self.check_path = check_path > self.syntax = syntax > > ftp_cmds = { > "ABOR" : CommandProperty(perm=None, auth_needed=True, > arg_needed=False, check_path=False, syntax="ABOR (abort transfer)."), > "APPE" : CommandProperty(perm='a', auth_needed=True, > arg_needed=True, check_path=True, syntax="APPE <SP> file-name > (append data to an existent file)."), > "CDUP" : CommandProperty(perm='e', > auth_needed=True,arg_needed=False, check_path=False, syntax="CDUP (go > to parentdirectory)."), > ... > ... > ... > } > > ...but I find it somewhat redundant and... "ugly". > I was wondering if there was some kind of data type which could better > fit such purpose or if someone could suggest me some other approach to > do this same thing. Maybe using a dictionary is not the better choice > here.
How about something like this? The idea is to summarize the command table, then construct the ftp command dictionary programatically from it. cmd_table = dict( ABOR='-AR- (abort transfer)', APPE='aARP <SP> file-name (append data to a file)', CDUP='eA-- (go to parent directory)', ... ) The first block of four characters give the options: permission, whether authentication is needed, whether the argument is required, and whether the path needs checking. Permission is the permission letter or - (for none), A or - for authentication, R or - for argument required, and - or P for path required. Then the help text follows (with the command name omitted since it's redundant). Turning these into CommandProperty's is straightforward (untested code): ftp_commands = {} for cmd, descriptor in cmd_table.iteritems(): options, help = descriptor.split(' ', 1) options = [None if opt == '-' else opt for opt in options] perm, auth, arg, path = options assert perm is None or perm in 'ae...' assert auth is None or auth == 'A' assert arg is None or arg == 'R' assert path is None or path == 'P' ftp_commands[cmd] = CommandProperty(perm=perm, auth_required=auth, arg_required=arg, check_path=path, syntax = '%s %s' % (cmd, help)) -- Paul Hankin -- http://mail.python.org/mailman/listinfo/python-list