0

I have been a PHP developer for the last decade, but figured it might be a wise move to learn another language. Like Python.
Python in and off itself isn't so hard to understand when you've got a background in programming.

What I can't yet understand though is how to structure my application and how to layout my classes. In PHP the convention is to do something like this: Vendor\Module\SubModule\Class, which has a direct mapping to a directory and file on the file system, Class.php being the file where the Class is defined.

The closest thing I have gotten in Python is this: Module.Class, where Module.py is the file where Class is defined. So with this structure, all classes belonging to this module should be defined in Module.py.

I don't want to emulate the PHP way of doing things, I just provided it for context.

So the question really is: What is the pythonic way of structuring an application?

Edit
Alright, maybe the question is too broad. To learn python I am converting some php scripts to Python. I have a script that imports files with cluster information into a database. My php structure looks like this:

.
`-- Company
    |-- Cluster
    |   |-- Cluster.php
    |   |-- Import
    |   |   |-- Array.php
    |   |   `-- Csv.php
    |   |-- Import.php
    |   |-- Map.php
    |   `-- Sync.php

So I have an Import interface Company\Cluster\Import.php which is implemented by two scripts: Company\Cluster\Import\Array.php and \Csv.php
Further I have some classes that take care of handling and preparing the incoming data to send off to the DAO.

How might I structure this application in Python?

6
  • Use any framework, each framework has its own structure. Commented Mar 28, 2014 at 7:05
  • 1
    Might be helpful: coderwall.com/p/lt2kew Commented Mar 28, 2014 at 7:05
  • Thanks @sshashank124, I will check out that page. Commented Mar 28, 2014 at 7:11
  • This depends entirely on what sort of code you're writing. Commented Mar 28, 2014 at 7:12
  • @msvalkon, why would it depend on that? Of course, for a cli application you would probably not need an mvc structure, but besides that, why would it matter? Commented Mar 28, 2014 at 7:14

1 Answer 1

2

It is a very open question, but I would say your problem is that you are missing the concept of package.

A package is a folder that contains modules, and other packages, allowing for nesting as much as you want. For Python to identify a folder as a package, it has to contain an __init__.py file (for the moment, just an empty file with that name is enough).

In python a module is a .py file. I would recommend you not to use that name for folders (aka packages).

Like this, you can create arbitrary structures. For instance, taking your example:

main.py
vendor/
    __init__.py
    mymodule/
        __init__.py
        mysubmodule/
             __init__.py
             any_class.py

Then you define your AnyClass in any_class.py. After that you can import from main.py this way:

from vendor.mymodule.mysubmodule.any_class import AnyClass

Bear in mind that you dont have to import explicitly the class. You can import the module (== python file), the package or whatever your want. Following examples are perfectly valid, although less common.

import vendor
my_obj = vendor.mymodule.mysubmodule.any_class.AnyClass()

from vendor import mymodule
my_obj = mymodule.mysubmodule.any_class.AnyClass()

...

from vendor.mymodule.mysubmodule import any_class
my_obj = any_class.AnyClass()

And another thing to keep in mind is, in python you are not forced to have one class per file like in java. You are free to have more, and if they are tightly related, very often makes sense to have them all in the same module.

Sign up to request clarification or add additional context in comments.

2 Comments

So, to extend on my example I create the following structure: Company\Cluster\Import.py in which I define the Array and Csv classes, right? Which I can then use as: import Company.Cluster.Import, csv = Import.Csv(). Thanks!
Close but not exact. You would have to do from Company.Cluster import Import

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.