Python vs C for a mail server
Jay Parlar
jparlar at cogeco.ca
Tue Jan 31 17:04:43 EST 2006
Randall Parker wrote:
> Alex Martelli wrote:
>
>> The "but without declaration it can't be self-documenting" issue is a
>> red herring. Reading, e.g.:
>>
>> int zappolop(int frep) { ...
>>
>> gives me no _useful_ "self-documenting" information about the role and
>> meaning of frep, or zappolop's result. The code's author must
>> obviously
>> add a little comment here to clarify -- and in that little comment,
>> adding the information about type, if at all relevant, is an obvious
>> task.
>
> Yes, one can use such simple types that the types do not tell you that
> much. They do tell you something though. The arg and return types are
> not list structures for example. They aren't floats either.
>
> However, C/C++ at least provide a way to make types tell you far more.
> For example, one could declare enum types:
>
> typedef enum MyArgType
> {
> // a bunch of enum const names here
> } MyArgType;
> typedef enum MyResultType
> // another bunch of enum const names
> } MyResultType;
>
> Then your example above becomes
>
> MyResultType zappolop(MyArgType frep) { ...
>
> and that's a lot more insightful.
>
Except once a type starts to get a little bit complicated, you're not
going to be able to "keep it in your head", and you'll have to go back
to the C++ definition of the type anyway when you want to know what it
does. Much like you'd have to go back to the Python source of a class.
(This is of course assuming that you put a comment in your Python code
saying that a certain kind of class is expected. I find it's obvious
about 80% of the time what's expected).
> I return objects in Python and in C++. In C++ I can see what their
> types are right on the m method signature. In Python I've got to write
> a comment on the line above it. If I change what type I return and
> forget to change the comment then the code isn't correctly documented
> anymore. I've done recently and found out with a runtime error while
> testing the Python. In C++ if I'd changed the return type the compiler
> would have told me if I didn't use it that way somewhere else.
Yeah, but you can't *just* change the type you're returning, and expect
to be done. You'll also have to change the source code of the function
to actually return something of that type. And you'll have to change
all the places where the function is called, to make sure that the
caller is storing the result in an appropriately typed variable.
Often times in Python, the thing you're returning is useful because of
duck-typing, not because it's actually of a particular class. Maybe in
some piece of code, you're returning a file() object, and all the
callers really care about is the ability to do a read() and write() on
that object.
Maybe later in the lifecycle of your program, you no longer store
things in the filesystem directly, but in a database. You'd have to
change your function such that it no longer returns a file() object,
but some object that instead is connecting to a database. But you still
only need to call read() and write() on it.
Well guess what: The *only* code you'll have to change is inside the
function returning the object, none of the callers would have to
change. That's completely different from C++, where you'll have to
change not only the return type and the function, but you'll also have
to change every single calling function to be aware of this new db
object. And not just how the callers store the returned object, but
also how they use that object. That's a LOT of work, for really no
gain.
And that's the ENTIRE point (as I see it) of the Python typing system.
Usually you know what you want to do, and you shouldn't have to fight
to do it.
If you haven't heard the term "duck typing" before, Wikipedia has a
decent page on it, and a simple Google search will return many more
results.
> There are a lot of stages at which to reduce the chance of bugs. While
> coding an editor can give you more help with code completion if you
> have more static typing. At compile time the compiler can tell you
> about errors if it knows the types you are using.
>
Yeah, but it can only tell you about type errors, and those aren't
really critical. They're the kind of error that takes a second to fix
when found. Yet *how much* time is often spent fighting with a compiler
to make it accept the types you actually want to use?
> I use PyChecker and PyLint and while they are incredibly helpful (and
> I'm grateful to their authors just as I am to Python's developers) they
> do not tell me as much as Borland's C++ compiler does. I get more
> runtime errors with my Python code than with my C++ code.
>
That's to be expected, but the time needed to get to a runtime error is
so much less in Python (especially if you've got good unit/integration
tests). I recommend you bring IPython into your development tools, so
you can easily import small parts of your code and hand test them in
isolation.
> Still, I find Python useful and better than C++ in some situations.
> But I wish it provided better options for allowing me to indicate types
> so that more errors could get caught sooner and so that editor code
> completion could be smarter.
Are you really getting a lot of type errors, so many that it's
disrupting your development cycle? Just on my own experience, I get
more type errors in C++ (ie. the compiler getting angry at me) because
it's so picky about everything, and I have to spend so much time
working around C++'s typing system. I don't really get a lot of type
errors in my Python code, especially working with libraries I've used a
lot.
And if you *still* feel weary, then you can do some kind of adaption
(see Alex Martelli's PEP 246 http://www.python.org/peps/pep-0246.html).
There are two adaption packages out there, one from Zope (which is also
used by Twisted), and one by PJE, called PyProtocols,
http://peak.telecommunity.com/PyProtocols.html
I have used PyProtocols extensively in the past, with great success.
Adaption seems to work best in the areas of frameworks, where a large
chunk of code written by someone else is expecting *you* to pass it
objects of the right (duck) type.
Jay P.
More information about the Python-list
mailing list