2012-04-26 13 views
5

मुझे लगता है कि लोगों को आम तौर पर इस तरह pygame आयात:क्या कोई इस अजीब पायगम आयात सम्मेलन को समझा सकता है?

import pygame 
from pygame.locals import * 

मुझे समझ नहीं आता के लिए दूसरी पंक्ति क्या। अगर हम पहले से ही पूरे पायगम आयात करते हैं, तो pygame.locals आयात क्यों करें? पगमेम पहले ही इसे आयात करने के बाद इसमें शामिल नहीं करता है?

उत्तर

6
import pygame 

पायगैम मॉड्यूल को "पायगम" नामस्थान में आयात करता है।

from pygame.locals import * 

आपके वर्तमान नामस्थान में pygame.locals में सभी नामों को कॉपी करता है। यह निरंतर नहीं है, लेकिन आपको टाइपिंग बचाता है।

5

वास्तव में, pygame docs से:

इस मॉड्यूल pygame द्वारा इस्तेमाल किया विभिन्न स्थिरांक होता है। इसकी सामग्री स्वचालित रूप से pygame मॉड्यूल नेमस्पेस में रखी जाती है। हालांकि, एक अनुप्रयोग pygame.locals का उपयोग केवल 'pygame.locals import *' से 'Pygame स्थिरांक को शामिल करने के लिए कर सकता है।

तो import pygame का उपयोग करते समय ये सभी स्थिरांक पहले से मौजूद हैं। हम यह देख सकते हैं अगर हम ऐसा करते हैं:

>>> import pygame 
>>> from pygame.locals import * 
>>> set(dir(pygame.locals)).issubset(set(dir(pygame))) 
True 

तो, pygame.localsimport pygame के एक सबसेट है .. तो बिल्कुल कोई मतलब नहीं कर रहा है, तो आप पहले से ही pygame आयात किया है! इसके अलावा आप उन्हें pygame उपसर्ग के बिना एक्सेस कर सकते हैं।

+0

यह थोड़ा अनावश्यक लगता है। – corazza

+2

@बेन: यह अनावश्यक नहीं है। आप अपने नामस्थान में क्या प्राप्त करते हैं, और कैसे स्पष्ट रूप से स्पष्ट कर रहे हैं। –

+4

'pygame.locals' को स्थानीय कहा जाता है क्योंकि यह उन कार्यों से भरा होता है जिन्हें आप अक्सर कॉल करते हैं। हर बार 'pygame.locals.' जोड़ना कोड कम कॉम्पैक्ट करेगा। –

1
import pygame 
from pygame.locals import * 

http://www.pygame.org/docs/tut/ImportInit.html

यहाँ पहली पंक्ति केवल आवश्यक है। यह सभी उपलब्ध पायगैम मॉड्यूल को पायगम पैकेज में आयात करता है। दूसरी पंक्ति वैकल्पिक है, और आपकी स्क्रिप्ट के वैश्विक नामस्थान में स्थिरांक और कार्यों का सीमित सेट रखती है।

1

क्या पगमेम पहले ही इसे आयात करने के बाद इसमें शामिल नहीं करता है?

नहीं। जरुरी नहीं।

stefanos-imac:python borini$ touch a/__init__.py 
stefanos-imac:python borini$ touch a/b.py 
stefanos-imac:python borini$ echo "print 'hello' " >a/b.py 
stefanos-imac:python borini$ python 
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import a 
>>> import a.b 
hello 
>>> 
2

जब आप निष्पादित

import pygame 

pygame पूरी तरह से आयातित और काम करने के लिए तैयार कर रहा है, कोई और अधिक आयात की जरूरत है।

अब सवाल इस लाइन के बारे में है:

from pygame.locals import * 

कई कारण यह प्रयोग किया जाना चाहिए रहे हैं, और कुछ कारणों से ऐसा करने के लिए नहीं।

  1. प्रदर्शन। जब आप foo.bar.baz.ClassName.classmethod() जैसे कुछ टाइप करते हैं, तो नामस्थान में 4 लुकअप होंगे, जिनकी लागत कुछ समय होगी। कोड में ऐसी अधिक लाइनें, समय की अधिक अनावश्यक अपशिष्ट।
  2. सरलता। जब आप ट्यूटोरियल लिखते हैं, तो आप चीजों को जितना संभव हो उतना सरल समझाने की कोशिश करते हैं। तो कम कोड, बेहतर ट्यूटोरियल।
  3. आसानी से। जब आप अपना कोड टाइप करते हैं, तो आप इसे विभिन्न फ़ाइलों में फैलाते हैं। क्योंकि छोटी तरफ-फाइलों के साथ काम करना आसान है, और फिर उन सभी को मुख्य में आयात करें। लेकिन आप पूरी तरह से समझते हैं कि आप क्या आयात कर रहे हैं।
  4. नेमस्पेस प्रदूषण। जब आप मॉड्यूल से ग्लोबल्स में सब कुछ आयात करते हैं, तो आप वैश्विक चर की पसंद में अधिक सीमित होते हैं। उदाहरण के लिए, from struct import * आप अपने फ़ंक्शन को pack के रूप में नामित नहीं कर सकते हैं। तो, इस तरह के आयात का उपयोग करने से पहले, आपको मॉड्यूल का पता लगाना चाहिए। इसमें क्या शामिल है? यह अपने आप से क्या आयात करता है?
  5. मेस। जब आप इस तरह के आयात का उपयोग कई बार करते हैं, from foo import * और from bar import * और from baz import *, कुछ चर या स्थिरांक छायांकित या ओवरराइट किए जा सकते हैं। इस उदाहरण में, foo.versionbar.version के साथ ओवरराइट किया गया है, जिसे अब version नाम दिया गया है। तो, foo.checkversion() अब और सही तरीके से काम नहीं करेगा।

उचित रूप से सामान्य रूप से प्रयुक्त कार्यों को आयात करने के लिए उचित तरीका है, या उन्हें त्वरित संदर्भ देना है, खासकर जब आप मॉड्यूल को अच्छी तरह से नहीं जानते हैं।

उदाहरण के लिए:

from foo.bar.baz import a_very_useful_function 

या

import foo.bar.baz 
quick_referenced_fn = foo.bar.baz.a_very_useful_function 

यहाँ quick_referenced_fn अभी भी foo.bar.baz.a_very_useful_function है और foo.bar.baz का नाम स्थान में काम करता है, लेकिन दुभाषिया सीधे अपने पता जानता है और अतिरिक्त लुकअप नहीं होगा।

0

मुझे इसके बारे में चिंता नहीं होगी। मुझे पता है कि आपको बताया गया है कि * आयात खराब हैं। यह कुछ हद तक सच है, जब तक कि पगम डेवलपर्स ने विशेष रूप से __all__ विशेषता को परिभाषित नहीं किया है, जिसमें उन्होंने उन सभी आसान-डेन्डी स्थिरांक रखे हैं, और उनके पास है। इसलिए, इस तरह उन्होंने इस विशेष * आयात को सुरक्षित बना दिया।

*__all__ विशेषता से संबंधित है, इसलिए सभी स्थिरांक __all__ विशेषता में शामिल के लिए pygame.locals स्रोत कोड की खोज।

संबंधित मुद्दे