Hi George, 

[george young Fri, Dec 10, 2004 at 10:45:47AM -0500]
> [python 2.3.3, x86 linux]
> I recently found myself writing something like:
> 
> def get_connection():
>     if tcp_conn():
>         if server_allows_conn():
>             return 'good_conn'
>         else:
>             return 'bad_auth'
>     else:
>         return 'no_server'
> 
> cn = get_connection()
> if cn == 'good_con': ...
> 
> 
> This is obviously just evil, since a misspelling in the string
> return is treacherous.

Right. 

I usually like to look at such problems from the angle of 
what is most convenient for the *caller* side? 

And having to adress function attributes does
not seem convenient.  I'd probably like to do from 
the caller side something like: 

    conn = get_connection() 
    if conn.good: 
        ... 
    elif conn.badauth: 
        ... 
    elif conn.noserver: 
        ... 

which allows you to freely choose and hide your actual
implementation at the "called" side. Example: 

    class Connection(object): 
        def __init__(self, **kw): 
            for name in kw: 
                assert name in ('good', 'badauth', 'noserver'), name 
                setattr(self, name, kw[name]) 

    def get_connection():
        if tcp_conn():
            if server_allows_conn():
                return Connection(good=True) 
            else:
                return Connection(badauth=True) 
        else:
            return Connection(noserver=True) 
 
And btw, the view of "what do i want at the caller side?" 
is natural if you do test-driven development and actually 
first write your tests.  Another reason why testing is 
a good thing :-) 

cheers & HTH, 

    holger
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to