Searching for some kind of data type

Paul Hankin paul.hankin at gmail.com
Sat Aug 2 14:58:05 EDT 2008


On Aug 2, 1:12 pm, "Giampaolo Rodola'" <gne... at gmail.com> 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



More information about the Python-list mailing list