Python, проверьте тип объекта после циклического импорта - PullRequest
1 голос
/ 22 июля 2011

Вот два файла, foo.py и bar.py bar.py имеет ...

from foo import *

... наверху. bar.py использует типы, определенные n foo.

При импорте bar.py из foo у меня возникают проблемы при определении типов объектов. Глядя на приведенный ниже пример, почему вызовы isinstance возвращают значение False? Как я могу проверить, совпадают ли эти типы?

Спасибо

===== foo.py =====

#!/usr/bin/env python

class Spam(object):
    def __init__(self, x):
        self.x = x
    def funcA(self):
        print 'function a'
    def __str__(self):
        return 'Spam object %s' % repr(self.x)

class Eggs(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
    def funcB(self):
        print 'function b'
    def __str__(self):
        return "Eggs object (%s, %s, %s)" % (repr(self.x), repr(self.y), repr(self.z))

def main(fname):
    if not fname.endswith('.py'):
        raise Exception("Must be a .py file")
    module = __import__(fname[:-3])
    for item in module.DATA:
        if isinstance(item, Spam):
            item.funcA()
        elif isinstance(item, Eggs):
            item.funcB()
        print item

if __name__ == '__main__':
    import sys
    for fname in sys.argv[1:]:
        main(fname)
    sys.exit(0)

===== bar.py =====

from foo import *
DATA=[
Spam("hi"),
Spam("there"),
Eggs(1, 2, 3),
]

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Вы пробовали печатать Spam, Eggs и тип item?

Spam is <class '__main__.Spam'>
Eggs is <class '__main__.Eggs'>
type of item is <class 'foo.Spam'>
Spam object 'hi'
type of item is <class 'foo.Spam'>
Spam object 'there'
type of item is <class 'foo.Eggs'>
Eggs object (1, 2, 3)

Модуль foo.py запускается дважды, один раз как основная программа и один раз при импортеbar.py.

В основной программе Spam и Eggs определены как __main__.Spam и __main__.Eggs.

В импортированном модуле Spam и Eggs определены как foo.Spam и foo.Eggs.

__main__.Spam! = foo.Spam, __main__.Eggs! = foo.Eggs.

1 голос
/ 22 июля 2011

С:

if __name__ == '__main__':
    import sys
    main('bar.py')
    sys.exit(0)

Я получил:

Spam object 'hi'
Spam object 'there'
Eggs object (1, 2, 3)

Переместите основной код и основную функцию в другой файл и импортируйте foo, и он будет работать

#-- main.py --

import foo

def main(fname):
    if not fname.endswith('.py'):
        raise Exception("Must be a .py file")
    module = __import__(fname[:-3])
    for item in module.DATA:
        if isinstance(item, foo.Spam):
            item.funcA()
        elif isinstance(item, foo.Eggs):
            item.funcB()
        print item

if __name__ == '__main__':
    import sys
    main('bar.py')
    sys.exit(0)
...