初学者:python名称空间冲突?

时间:2012-02-29 19:31:34

标签: python django oop

免责声明:我是python的新手,但拥有drupal编程经验

我正在阅读Django权威指南(http://www.djangobook.com/en/1.0/chapter07/)。发出后

python manage.py startapp books

python创建了包含views.py的books包。在本教程的后面,我们在views.py文件中输入以下内容:

# Create your forms here.
from django import forms
from django.forms import form_for_model
from models import Publisher

PublisherForm = forms.form_for_model(Publisher) 

TOPIC_CHOICES = (
    ('general', 'General enquiry'),
    ('bug', 'Bug report'),
    ('suggestion', 'Suggestion'),
)

class ContactForm(forms.Form):
    topic = forms.ChoiceField(choices=TOPIC_CHOICES)
    message = forms.CharField(widget=forms.Textarea())
    sender = forms.EmailField(required=False)

    def clean_message(self):
        message = self.cleaned_data.get('message', '')
        num_words = len(message.split())
        if num_words < 4:
            raise forms.ValidationError("Not enough words!")
        return

除非我输入错误或误解了某些内容(可能是其中之一),否则我们现在(貌似)会在表单(books / forms.py)和django表单之间发生冲突。那么,Python在

中引用了哪些内容
message = forms.CharField(widget=forms.Textarea())

3 个答案:

答案 0 :(得分:3)

本声明:

from django.forms import form_for_model

实际上只将名称form_for_model拉入模块全局命名空间,现有名称forms不受影响。即便如此:

import django.forms

不会有任何问题,因为它只能以完全限定的形式django.forms(这是unambigios并且不会与forms发生冲突)使名称可用。

答案 1 :(得分:0)

与PHP不同,Python只导入当前命名空间,每个模块都是自己的命名空间;其他模块中的导入不会影响当前的命名空间,反之亦然。

答案 2 :(得分:0)

虽然如果存在冲突,此示例不会引发冲突,但您可以使用from ____ import ___ as ___指定自己的导入名称

http://docs.python.org/reference/simple_stmts.html#import