Searching for some kind of data type

Larry Bates larry.bates at websafe.com`
Sat Aug 2 11:28:28 EDT 2008


Giampaolo Rodola' 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.
> 
> 
> Thanks in advance
> 
> 
> --- Giampaolo
> http://code.google.com/p/pyftpdlib/


Seems completely reasonable to me.  You might just consider using keyword 
arguments in the __init__ method and eliminate the dictionary altogether.

Not tested, but you will get the idea:

class CommandProperty:
     def __init__(self, perm = perm, auth_needed = True, arg_needed = True,
                  check_path = False, syntax = syntax):

         self.perm = perm
         self.auth_needed = auth_needed
         self.arg_needed = arg_needed
         self.check_path = check_path
         self.syntax = syntax

ftpCommands = dict(
     ABOR = CommandProperty(perm = None, arg_needed = False,
              syntax="ABOR (abort transfer)."),
     APPE = CommandProperty(perm = 'a',  check_path=True,
              syntax = "APPE <SP> file-name (append data to" \
                       "an existent file)."),
     CDUP = CommandProperty(perm= 'e', arg_needed = False,
              syntax="CDUP (go> to parentdirectory)."),
...
...
...
     )


IMHO this is a "little" easier to manage because you can take advantage of the 
default values for keyword arguments to eliminate some of the arguments.

Hope this helps,
Larry



More information about the Python-list mailing list