Hacker News .hnnew | past | comments | ask | show | jobs | submitlogin
Python Is Not Java (dirtsimple.org)
48 points by kqr2 on Feb 25, 2009 | hide | past | favorite | 31 comments


I've been noticing the time machine effect the article mentions using Clojure. A couple weeks ago, I needed a GUI to update whenever an agent's value changed, and it turned out that watchers had been added to the language only a few days before.

I think the effect is what PG was talking about when he discussed the difference between languages designed for the designer to use and languages designed for other people.


Since I've started using python, the language has had a big impact not only on my code style but also the way I handle problems and find solutions.

The language really teaches you the Zen of python.

$ python

>>> import this


$ python -c "import this"


#!/usr/bin/env python

from __future__ import braces


$ python -m this


XML is not the answer. It is not even the question.

I have a question for the Python hackers in the audience: what file format(s) do you use for configuration files? I've been using INI style files up until now, but I've been thinking of switching to XML for more complicated formats. For example, what about something like the following example. What format would you use to store this type of configuration data for a Python application?

  <?xml version="1.0" encoding="utf-8" ?>
  <directoriesToBackUp>
  	<directoryInfo>
		<directoryName>/media/programming</directoryName>
		<excludedDirs>
			<dir>/media/programming/log_files</dir>
			<dir>/media/programming/temp_files</dir>
		</excludedDirs>
	</directoryInfo>
	<directoryInfo>
		<directoryName>/media/documents</directoryName>
		<excludedDirs>
			<dir>/media/documents/archive</dir>
		</excludedDirs>
	</directoryInfo>
  </directoriesToBackUp>


what file format(s) do you use for configuration files?

YAML.

  directoriesToBackup:
      /media/programming:
          exclude:
              - /media/programming/log_files
              - /media/programming/temp_files
      /media/documents:
          exclude:
              - /media/documents/archive


Wow! I've heard YAML mentioned before, but this is the first actual example I've seen.

I'm very embarrassed that this beautiful standard has been around for ~5 years without me noticing it.

/me goes off to read http://yaml.org/spec/1.2/


  /me goes off to read http://yaml.org/spec/1.2/
There's another problem. YAML is so simple, you don't need to read the damn manual for it. That example already taught you 80%. Ok, the easy 80%. But if you come from the Java (and XML) world, reading the manual is what you do just to get started.


Reading the manual once (at least the part with the examples) is indeed a good idea to get an overview of the possible constructs but once you have them down it quickly becomes a no-brainer. Under the hood YAML is surprisingly complex (can do full blown object serialization if you want to) but the everyday stuff is just perfect for typing it into an editor without thinking about it - and without matching up braces all the time like in JSON.


Try JSON:

  { 
  "directories_to_backup": [
    {"directory_name": "/media/programming",
     "exclude_dirs": ["/media/programming/log_files",  
                      "/media/programming/temp_files" ]
    },
    {"directory_name": "/media/documents",
     "exclude_dirs": ["/media/documents/archive"]
    }
}

Also, why not just use a python data structure? Do you really need a plain text config file?


config.py:

  backup = [{
        'name': '/media/programming',
        'exclude': ['log_files', 'temp_files'],
    }, {
        'name': '/media/documents',
        'exclude': ['archive'],
    }]
of the top of my head.

*editted for formatting


  jeff:disqus devin$ wc settings.py settings.xml
       1      15     142 settings.py
      16      19     461 settings.xml
      17      34     603 total
30% of the words. and, in my opinion, just as readable if not more.


Or with a little less clutter :-)

  <backup>
    <dir name="/media/programming" exclude="log_files temp_files" />
    <dir name="/media/documents" exclude="archive" />
  </backup>


i'd probably define some helper functions to check argument values and such:

  config = backup(
    directory('/media/programming', exclude=['log_files', 'temp_files']),
    directory('/media/documents', exclude='archive')
  )


Yeah, I've done that as well.

Are there any security considerations to think about if using that approach?


well. it's mutable. your code can change it. don't do it (often). then you're just programming with lots of global state.


Thats interesting because I recently tackled the same problem of storing configuration details for backing up files.

I took Python's ConfigParser module and modified it to suit my needs. The config file looks a bit like this:

    [directory-details]
    path = /media/programming
    exclude_dirs = *log_files, *temp_files

    [directory-details]
    path = /media/documents
    exclude_dirs = /media/documents/archive
Honestly, though, xml is a perfectly valid format for storing such configuration.


Honestly, though, xml is a perfectly valid format for storing such configuration.

Not when a human has to touch it without tool support.


Disclosure: I write very little code targeted at non-technical endusers, in fact most my code is for my own use. These facts strongly influence my config file solution.

If find the need for a config file (I tend to like command line options better) 95% of the time I use python code and import.

The benefits are many; zero work required, known syntax, powerful syntax, arbitrarily complex, no parsing required, nice traceback/errors with screwed up syntax.

    #file config.py
    
    debug = True
    
    directories_to_backup = [
    #   path                  exclude these subdirs
       ("/media/programming", ("log_files","temp_files")),
       ("/media/documents",   ("archive",)),
    ]
    
    # or, if you relish verbosity
    directory_info = dict
    directories_to_backup = [
       directory_info(path="/media/programming", exclude=("log_files","temp_files")),
       directory_info(path="/media/documents", exclude=("archive",)),
       ]
    
    # the options are as endless as your knowledge of Python

Usage

    import config
    
    for path, excludes in config.directories_to_backup:
      garbleblaster(path, excludes)


There's a talk specifically about this conundrum at PyCon this year! You should come!

http://us.pycon.org/2009/conference/schedule/event/5/


Ancient flamebait.


So is python java now?


Ideally we should use the right tool for the job, but sometimes time constraints pressure us to try to use the tool we know best for any job, and the next thing you know we're using a wrench to twist a nail into the wall. We might get it in there, but it's ugly, crooked, and likely to fall apart with little weight, and all because we didn't have, or didn't want to take, the time to learn to use a hammer.

To be fair, one equally shouldn't try to program in Java with python on the brain, it's going to turn out just as hideous and slow, and the developer will probably be more furious at the number of recompilations caused because approach the problem with the right mindset.


2004 is not 2009.


This essay is referenced in the book Dreaming in Code by Scott Rosenberg.

(As a relative newbie to Python who has in the past coded in a bunch of other languages - including Java - I had actually been meaning to look it up.)


PINJ? That's a good name for a language. Googlable too, unlike Arc :-)


Thank you captain obvious...


For those that like to join the downmod mob, I read the article and to expand a bit on my one line statement, anybody that will try to shoehorn language constructs from one language into another without first properly learning that language is going to be making these exact mistakes.

It's patently obvious.

Languages are different for a reason, and if you wish to do meaningful work in a language you would do well to familiarize yourself with the core constructs of a language before embarking on a major project, especially if you have a lot of expertise in some other language, because you may have to unlearn a few things.


Now it's even


George Bush doesn't care about Python people.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: