По существу единственной вещью в Python, который представляет новый объем, является функциональное определение. Классы являются чем-то вроде особого случая, в котором что-либо определенное непосредственно в теле помещается в пространство имен класса, но они не непосредственно доступны из методов (или вложенные классы), они содержат.
В Вашем примере существует только 3 объема, где x будет искаться в:
объем спама - содержащий все определенное в code3 и code5 (а также code4, Ваша переменная цикла)
глобальная область видимости - содержащий все определенное в code1, а также Foo (и безотносительно изменений после него)
builtins пространство имен. Что-то вроде особого случая - это содержит различный Python встроенные функции и типы, такие как len () и str (). Обычно это не должно быть изменено никаким пользовательским кодом, поэтому ожидать, что он будет содержать стандартные функции и ничто иное.
def foo():
x=4
def bar():
print x # Accesses x from foo's scope
bar() # Prints 4
x=5
bar() # Prints 5
Ограничения:
к Переменным в объемах кроме переменных локальной функции можно получить доступ, но не могут быть восстановлением к новым параметрам без дальнейшего синтаксиса. Вместо этого присвоение создаст новое локальный переменная вместо того, чтобы влиять на переменную в родительском объеме. Например:
global_var1 = []
global_var2 = 1
def func():
# This is OK: It's just accessing, not rebinding
global_var1.append(4)
# This won't affect global_var2. Instead it creates a new variable
global_var2 = 2
local1 = 4
def embedded_func():
# Again, this doen't affect func's local1 variable. It creates a
# new local variable also called local1 instead.
local1 = 5
print local1
embedded_func() # Prints 5
print local1 # Prints 4
для фактического изменения привязки глобальных переменных из функционального объема, необходимо определить, что переменная глобальна с глобальным ключевым словом. Например:
global_var = 4
def change_global():
global global_var
global_var = global_var + 1
В настоящее время нет никакого способа сделать то же для переменных во включении функция , объемы, но Python 3 представляет новое ключевое слово, "nonlocal
", который будет действовать похожим способом к глобальному, но для объемов вложенной функции.
Если вы используете приложение contenttypes, то это просто: http: // docs. djangoproject.com/en/dev/ref/contrib/contenttypes/[12110 visible
Если вы зарегистрируете свои модели в приложении администратора, вы сможете увидеть все атрибуты этих классов в документации администратора.
Если вы хотите играть, а не использовать хорошее решение , вы можете немного поиграть с интроспекцией Python:
import settings
from django.db import models
for app in settings.INSTALLED_APPS:
models_name = app + ".models"
try:
models_module = __import__(models_name, fromlist=["models"])
attributes = dir(models_module)
for attr in attributes:
try:
attrib = models_module.__getattribute__(attr)
if issubclass(attrib, models.Model) and attrib.__module__== models_name:
print "%s.%s" % (models_name, attr)
except TypeError, e:
pass
except ImportError, e:
pass
Примечание: это довольно грубая часть код; он будет предполагать, что все модели определены в «models.py» и наследуются от django.db.models.Model.
Простое решение:
import django.apps
django.apps.apps.get_models()
По умолчанию apps.get_models ()
не включают
Если вы хотите включить и их,
django.apps.apps.get_models(include_auto_created=True, include_swapped=True)
До Django 1.7 вместо этого используйте:
from django.db import models
models.get_models(include_auto_created=True)
Параметр include_auto_created
гарантирует что через таблицы, неявно созданные ManyToManyField
s, также будут извлечены.