पायथन में __future__ क्या है और इसका उपयोग कब और कैसे / और कैसे काम करता है


694

__future__अक्सर पायथन मॉड्यूल में दिखाई देता है। मुझे समझ में नहीं आ रहा है कि पायथन के डॉक को__future__ पढ़ने के__future__ बाद भी इसका क्या और कैसे / कब उपयोग करना है ।

क्या कोई उदाहरण के साथ समझा सकता है?

__future__मुझे मिले मूल उपयोग के संबंध में कुछ उत्तर सही लगे।

हालाँकि, मुझे यह समझने की ज़रूरत है कि कैसे __future__काम करता है:

मेरे लिए सबसे भ्रामक अवधारणा यह है कि कैसे एक मौजूदा अजगर रिलीज में भविष्य के रिलीज के लिए विशेषताएं शामिल हैं, और भविष्य के रिलीज से एक सुविधा का उपयोग करने वाले कार्यक्रम को पायथन के वर्तमान संस्करण में सफलतापूर्वक कैसे संकलित किया जा सकता है।

मैं अनुमान लगा रहा हूं कि वर्तमान रिलीज भविष्य के लिए संभावित विशेषताओं के साथ पैक की गई है। हालांकि, सुविधाएँ केवल उपयोग करके उपलब्ध हैं __future__क्योंकि वे वर्तमान मानक नहीं हैं। अगर मैं सही हूं तो मुझे बताएं।


10
यह भविष्य के कथन का मूल प्रस्ताव है। मुझे यह समझने में मदद मिली कि यह पहली जगह में क्यों है और इसलिए कब और कैसे इसका उपयोग स्वाभाविक रूप से करना है। python.org/dev/peps/pep-0236
Japaji Rajnish


3
एक भविष्य कथन कंपाइलर को एक निर्देश है कि एक विशेष मॉड्यूल को सिंटैक्स या शब्दार्थ का उपयोग करके संकलित किया जाना चाहिए जो कि पायथन के एक निर्दिष्ट भविष्य के रिलीज में उपलब्ध होगा। भविष्य के बयान का उद्देश्य पायथन के भविष्य के संस्करणों में प्रवास को आसान बनाना है जो भाषा में असंगत बदलाव लाते हैं। यह रिलीज से पहले प्रति-मॉड्यूल आधार पर नई सुविधाओं के उपयोग की अनुमति देता है जिसमें यह सुविधा मानक बन जाती है।
shivam13juna

जवाबों:


384

साथ __future__मॉड्यूल को शामिल किए जाने, आप धीरे धीरे असंगत परिवर्तन करने के लिए या नए कीवर्ड को शुरू करने में इस तरह के लोगों के आदी जा सकता है।

उदाहरण के लिए, संदर्भ प्रबंधकों का उपयोग करने के लिए, आपको from __future__ import with_statement2.5 में करना था , क्योंकि withकीवर्ड नया था और इसे किसी भी नाम के परिवर्तनशील नाम के रूप में उपयोग नहीं किया जाना चाहिए। withपायथन 2.5 या उससे अधिक उम्र के पायथन कीवर्ड के रूप में उपयोग करने के लिए , आपको ऊपर से आयात का उपयोग करना होगा।

एक और उदाहरण है

from __future__ import division
print 8/7  # prints 1.1428571428571428
print 8//7 # prints 1

__future__सामान के बिना , दोनों printबयान मुद्रित होंगे 1

आंतरिक अंतर यह है कि उस आयात के बिना, विधि के /लिए मैप किया जाता है __div__(), जबकि इसके साथ, __truediv__()इसका उपयोग किया जाता है। (किसी भी मामले में, //कॉल __floordiv__())

एप्रोपोस print: print3.x में एक फ़ंक्शन बन जाता है, एक कीवर्ड के रूप में अपनी विशेष संपत्ति खो देता है। तो यह दूसरा रास्ता है।

>>> print

>>> from __future__ import print_function
>>> print
<built-in function print>
>>>

151
मत भूलिए from __future__ import braces: p
mdeous

13
@zoogleflatt यदि आप एक टैब लड़के से अधिक हैं, तो आप PEP 8 नहीं जानते। यह टैब का उपयोग नहीं करने के लिए दृढ़ता से अनुशंसा की जाती है ...
Glglgl

5
@ अच्छी तरह से तकनीकी रूप से यह सिर्फ यह कहता है कि वे पसंद कर रहे हैं। यह पढ़ने के बाद मेरे लिए पूरी तरह से स्पष्ट नहीं था कि यह वास्तव में क्यों है, मुझे लगता है कि यह कोड स्तर बनाने के लिए इंडेंट स्तरों को बिल्कुल मेल खाने का अनुमान है?
जपजी रजनीश

4
@zoogleflatt यह भी निश्चित रूप से इस तथ्य के साथ करना है कि अधिकांश लोग 1 स्तर के इंडेंटेशन के लिए 4 रिक्त स्थान का उपयोग करते हैं, संगतता कारणों के लिए एक टैब 8 स्थानों के बराबर है और टैब और रिक्त स्थान को मिलाया जाता है। Py3)
Margl '

1
@whiteSkar मैं वर्तमान में अजगर 3 के नए संस्करणों के साथ अद्यतित नहीं हूं, लेकिन मुझे लगता है कि यह अभी भी उपयोग में है, बस आपको शायद इन पुरानी सुविधाओं के साथ इसकी आवश्यकता नहीं है। पायथन 3 में, printनिश्चित रूप से एक फ़ंक्शन है, लेकिन अन्य विशेषताएं हो सकती हैं जो उपयोग कर सकती हैं __future__। (संपादित करें: docs.python.org/3/library/__future__.html देखें जहां अभी भी इसका उपयोग किया जाता है।)
glglgl

195

जब तुम करोगे

from __future__ import whatever

आप वास्तव में एक importबयान का उपयोग नहीं कर रहे हैं , लेकिन भविष्य का बयान । आप गलत डॉक्स पढ़ रहे हैं, क्योंकि आप वास्तव में उस मॉड्यूल को आयात नहीं कर रहे हैं।

भविष्य के बयान विशेष हैं - वे बदलते हैं कि आपके पायथन मॉड्यूल को कैसे पार्स किया गया है, यही कारण है कि उन्हें फ़ाइल के शीर्ष पर होना चाहिए। वे आपकी फ़ाइल में शब्दों या प्रतीकों को नया - या अलग - अलग अर्थ देते हैं। डॉक्स से:

एक भविष्य कथन कंपाइलर के लिए एक निर्देश है कि एक विशेष मॉड्यूल को सिंटैक्स या शब्दार्थ का उपयोग करके संकलित किया जाना चाहिए जो कि पायथन के एक निर्दिष्ट भविष्य के रिलीज में उपलब्ध होगा। भविष्य के बयान का उद्देश्य पायथन के भविष्य के संस्करणों में प्रवास को आसान बनाना है जो भाषा में असंगत बदलाव लाते हैं। यह रिलीज से पहले प्रति-मॉड्यूल आधार पर नई सुविधाओं के उपयोग की अनुमति देता है जिसमें यह सुविधा मानक बन जाती है।

यदि आप वास्तव में __future__मॉड्यूल आयात करना चाहते हैं , तो बस करें

import __future__

और फिर इसे हमेशा की तरह एक्सेस करें।


4
तकनीकी रूप से, यह एक आयात विवरण भी है, क्योंकि संबंधित नाम स्थानीय चर से जुड़ा है। from __future__ import print_functionदोनों printकीवर्ड के व्यवहार को बदल देते हैं और एक रनटाइम प्रभाव के बराबर होता हैprint_function = __import__("__future__").print_function
pppery

112

__future__ एक छद्म मॉड्यूल है जो प्रोग्रामर नई भाषा सुविधाओं को सक्षम करने के लिए उपयोग कर सकते हैं जो वर्तमान दुभाषिया के साथ संगत नहीं हैं । उदाहरण के लिए, अभिव्यक्ति 11/4वर्तमान में मूल्यांकन करती है 2। यदि जिस मॉड्यूल में इसे निष्पादित किया जाता है वह निष्पादित करके सही विभाजन को सक्षम करता है:

from __future__ import division

अभिव्यक्ति 11/4का मूल्यांकन होगा 2.75__future__मॉड्यूल को आयात करने और इसके चर का मूल्यांकन करके , आप देख सकते हैं कि भाषा में पहली बार एक नई सुविधा कब जोड़ी गई थी और यह कब डिफ़ॉल्ट हो जाएगी:

  >>> import __future__
  >>> __future__.division
  _Feature((2, 2, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)

1
तो, चर में रिलीज़ संस्करण के आधार पर, यदि आपका दुभाषिया संकेत की तुलना में बाद के संस्करण का उपयोग कर रहा है, तो import __future__ xyzक्या यह नो-ऑप है?
रे

4
यह ब्राउज़र वर्ल्ड में कुछ
पॉलीफिल के

47

इसका उपयोग उन विशेषताओं का उपयोग करने के लिए किया जा सकता है जो पाइथन के पुराने रिलीज के दौरान नए संस्करणों में दिखाई देंगे।

उदाहरण के लिए

>>> from __future__ import print_function

आप printएक समारोह के रूप में उपयोग करने की अनुमति देगा :

>>> print('# of entries', len(dictionary), file=sys.stderr)

29

कुछ शानदार जवाब पहले से ही हैं, लेकिन उनमें से कोई भी इस __future__बात की पूरी सूची को संबोधित नहीं करता है कि वर्तमान में कथन क्या समर्थन करता है।

बस रखो, बयान भाषा के नए लक्षणों का उपयोग करने के अजगर दुभाषिए बाध्य करती है।__future__


वर्तमान में इसका समर्थन करने वाली विशेषताएं निम्नलिखित हैं:

nested_scopes

पायथन 2.1 से पहले, निम्नलिखित कोड एक NameError बढ़ाएगा :

def f():
    ...
    def g(value):
        ...
        return g(value-1) + 1
    ...

from __future__ import nested_scopesनिर्देश इस सुविधा के लिए अनुमति देगा सक्षम हो।

generators

क्रमिक जेनरेटर फ़ंक्शन जैसे कि नीचे दिए गए क्रमिक फ़ंक्शन कॉल के बीच स्थिति को बचाने के लिए:

def fib():
    a, b = 0, 1
    while 1:
       yield b
       a, b = b, a+b

division

क्लासिक विभाजन का उपयोग पायथन 2.x संस्करणों में किया जाता है। मतलब यह है कि कुछ डिवीजन स्टेटमेंट डिवीजन ("ट्रू डिवीजन") का एक उचित अनुमान लौटाते हैं और अन्य लोग फर्श ("फ्लोर डिवीजन") को वापस करते हैं। पायथन 3.0 में शुरू करके, सच्चे विभाजन द्वारा निर्दिष्ट किया जाता है x/y, जबकि मंजिल विभाजन द्वारा निर्दिष्ट किया जाता है x//y

from __future__ import divisionनिर्देश बलों अजगर 3.0 शैली विभाजन का उपयोग।

absolute_import

कई importकथनों को संलग्न करने के लिए कोष्ठक के लिए अनुमति देता है । उदाहरण के लिए:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

के बजाय:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

या:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

with_statement

बयानों withकी आवश्यकता को समाप्त करने के लिए try/finallyबयान को पायथन में एक कीवर्ड के रूप में जोड़ता है । इसका सामान्य उपयोग फ़ाइल I / O करते समय होता है जैसे:

with open('workfile', 'r') as f:
     read_data = f.read()

print_function:

स्टाइल स्टेटमेंट के print()बजाय पायथन 3 कोष्ठक-शैली फ़ंक्शन कॉल का उपयोग करने के लिए print MESSAGEमजबूर करता है।

unicode_literals

bytesवस्तु के लिए शाब्दिक वाक्य रचना का परिचय देता है । मतलब यह है कि इस तरह के बयान के रूप में bytes('Hello world', 'ascii')बस व्यक्त किया जा सकता है b'Hello world'

generator_stop

StopIterationअपवाद के साथ जनरेटर कार्यों के अंदर उपयोग किए गए अपवाद का उपयोग करता RuntimeErrorहै।

ऊपर वर्णित एक अन्य उपयोग यह नहीं है कि इस __future__कथन के लिए पायथन 2.1+ दुभाषियों के उपयोग की भी आवश्यकता है क्योंकि पुराने संस्करण का उपयोग करने से रनवे का अपवाद समाप्त हो जाएगा।


संदर्भ


यह मानते हुए कि आप ऑफ़लाइन हैं कि अजगर को कैसे पता चलता है कि भविष्य का संस्करण उपलब्ध है या नहीं? और भविष्य की सुविधाओं का उपयोग कैसे करता है यदि आपने अपने कंप्यूटर पर अजगर के भविष्य के संस्करण को स्थापित नहीं किया है?
मोहसिन हदादी

25

या यह कहना पसंद है "चूंकि यह अजगर v2.7 है, उस विभिन्न 'प्रिंट' फ़ंक्शन का उपयोग करें, जिसे अजगर v2.7 में भी जोड़ा गया है, जब इसे अजगर 3 में जोड़ा गया था। तो मेरा 'प्रिंट' अब बयान नहीं होगा। (उदा। प्रिंट "संदेश") लेकिन फ़ंक्शंस (जैसे, प्रिंट ("संदेश", विकल्प))। इस तरह जब मेरा कोड पायथन 3 में चलाया जाता है, तो 'प्रिंट' नहीं टूटेगा। "

में

from __future__ import print_function

प्रिंट_फंक्शन वह मॉड्यूल है जिसमें 'प्रिंट' के नए क्रियान्वयन का वर्णन है कि यह कैसे अजगर v3 में व्यवहार कर रहा है।

इसकी अधिक व्याख्या है: http://python3porting.com/noconv.html


2

उन उपयोगों में से एक जो मुझे बहुत उपयोगी लगे, वह मॉड्यूल print_functionसे __future__है।

पायथन 2.7 में, मैं चाहता था कि अलग-अलग प्रिंट स्टेटमेंट से एक ही स्थान पर बिना लाइन के छपे जा सकें।

यह अंत में अल्पविराम (",") का उपयोग करके किया जा सकता है, लेकिन यह एक अतिरिक्त स्थान भी जोड़ता है। उपरोक्त कथन जब प्रयोग किया जाता है:

from __future__ import print_function
...
print (v_num,end="")
...

यह v_numरिक्त स्थान के बिना एक पंक्ति में प्रत्येक पुनरावृत्ति से मूल्य को प्रिंट करेगा ।


-3

अजगर 3.0 के बाद, प्रिंट अब केवल एक बयान नहीं है, इसके बजाय एक फ़ंक्शन है। और PEP 3105 में शामिल है।

इसके अलावा, मुझे लगता है कि पायथन 3.0 पैकेज में अभी भी ये विशेष कार्यक्षमता है। पायथन में एक पारंपरिक "पिरामिड कार्यक्रम" के माध्यम से इसकी उपयोगिता देखें:

from __future__ import print_function

class Star(object):
    def __init__(self,count):
        self.count = count

    def start(self):
        for i in range(1,self.count):
            for j in range (i): 
                print('*', end='') # PEP 3105: print As a Function 
            print()

a = Star(5)
a.start()

Output:
*
**
***
****

यदि हम सामान्य प्रिंट फ़ंक्शन का उपयोग करते हैं, तो हम एक ही आउटपुट प्राप्त करने में सक्षम नहीं होंगे, क्योंकि प्रिंट () एक अतिरिक्त नई रेखा के साथ आता है। तो हर बार लूप के निष्पादन के लिए आंतरिक, यह अगली पंक्ति पर * प्रिंट करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.