views:

30

answers:

3

I'm using Python 2.6.1 on OS X.

I have two simple python files (below) but when I run:

python update_url.py

I get on the terminal:

Traceback (most recent call last):
  File "update_urls.py", line 7, in <module>
    main()
  File "update_urls.py", line 4, in main
    db = SqliteDBzz()
NameError: global name 'SqliteDBzz' is not defined

I tried renaming the files and classes differently, which is why there's x and z on the ends. ;)

sqlitedbx.py

class SqliteDBzz:
    connection = ''
    curser = ''

    def connect(self):
        print "foo"

    def find_or_create(self, table, column, value):
        print "baar"

update_url.py

import sqlitedbx

def main():
    db = SqliteDBzz()
    db.connect

if __name__ == "__main__":
    main()
A: 

try

from sqlitedbx import SqliteDBzz
joaquin
That worked, i like this method better
Wizzard
@Wizzard: Note this is the same as "import sqlitedbx" plus "SqliteDBzz = sqlitedbx.SqliteDBzz" (followed by "del sqlitedbx", if you want to get technical).
Roger Pate
+3  A: 

You need to do:

import sqlitedbx

def main():
    db = sqlitedbx.SqliteDBzz()
    db.connect()

if __name__ == "__main__":
    main()
SilentGhost
that worked... but why do i have to prefix filename?
Wizzard
@Wizzard: well, how else do you relate `sqlitedbx` to the `SqliteDBzz`?
SilentGhost
@Wizzard: Because that's how modules, variables, and attributes work in Python.
Roger Pate
Because `import sqlitedbx` imports `sqlitedbx.py` into its own namespace. If you don't want to prefix it with the filename, import it differently into your script's namespace: `from sqlitedbx import @Wizzard: SqliteDBzz`.
Tamás
I see, makes sense now... thank you
Wizzard
+1  A: 

Importing the namespace is somewhat cleaner. Imagine you have two different modules you import, both of them with the same method/class. Some bad stuff might happen. I'd dare say it is usually good practice to use:

import module

over

from module import function/class
araf3l