পাইথনে __ ভবিষ্যত__ কী এবং কীভাবে / কখন ব্যবহার করা যায় এবং কীভাবে এটি ব্যবহার করে


694

__future__পাইথন মডিউলগুলিতে প্রায়শই উপস্থিত হয়। পাইথনের ডকটি পড়েও কীসের __future__জন্য এবং কখন / কখন এটি ব্যবহার করতে হয় তা আমি বুঝতে পারি না ।__future__

কেউ উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন?

__future__আমি পেয়েছি বেসিক ব্যবহার সম্পর্কে কয়েকটি উত্তর সঠিক বলে মনে হয়েছিল।

তবে কীভাবে __future__কাজ করে সে সম্পর্কে আমার আরও একটি বিষয় বুঝতে হবে :

আমার কাছে সবচেয়ে বিভ্রান্তিকর ধারণাটি হল কীভাবে একটি অজগর রিলিজটিতে ভবিষ্যতের রিলিজের বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে এবং ভবিষ্যতের রিলিজের কোনও বৈশিষ্ট্য ব্যবহার করে একটি প্রোগ্রাম কীভাবে পাইথনের বর্তমান সংস্করণে সফলভাবে সংকলন করা যায়।

আমি অনুমান করছি যে বর্তমান প্রকাশটি ভবিষ্যতের সম্ভাব্য বৈশিষ্ট্যগুলির সাথে প্যাকেজযুক্ত। তবে বৈশিষ্ট্যগুলি কেবলমাত্র ব্যবহারের মাধ্যমে উপলব্ধ __future__কারণ সেগুলি বর্তমান মান নয়। আমি ঠিক থাকলে আমাকে জানাবেন।


10
এটিই ভবিষ্যতের বক্তব্যের মূল প্রস্তাব। এটি কেন প্রথম স্থানে রয়েছে তা বুঝতে এবং আপনাকে কখন এবং কীভাবে এটি প্রাকৃতিকভাবে অনুসরণ করা যায় তা বুঝতে সহায়ক হয়েছিল। python.org/dev/peps/pep-0236
Jpaji 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: printএকটি বিশেষ শব্দটি কীওয়ার্ড হিসাবে হারাতে, 3.x এ একটি ফাংশন হয়ে যায়। সুতরাং এটি অন্যভাবে রাউন্ড।

>>> print

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

151
ভুলে যাবেন না from __future__ import braces: পি
মডিউস

13
@ জগলফ্ল্যাট আপনি যদি কোনও ট্যাব লোকের চেয়ে বেশি হন তবে আপনি পিইপি 8 জানেন না tab ট্যাব ব্যবহার না করার জন্য
দৃ strongly়ভাবে

5
@glglgl ভাল প্রযুক্তিগতভাবে এটি কেবল তাদের পছন্দসই বলেছে। এটি কেন পড়ার পরে আমার কাছে সম্পূর্ণ পরিষ্কার ছিল না, আমি অনুমান করছি যে কোডটি আরও সুন্দর করার জন্য এটি ইন্ডেন্টের স্তরগুলি ঠিক মেলে?
জাপাজি রজনীশ

4
@ জগলফ্ল্যাট এটি অবশ্যই এই সত্যটিও করতে হবে যে বেশিরভাগ লোকেরা 1 স্তরের ইন্ডেন্টেশনের জন্য 4 টি স্পেস ব্যবহার করে, সামঞ্জস্যতার কারণে একটি ট্যাব 8 টি স্পেসের সমতুল্য এবং ট্যাব এবং ফাঁকা স্থানের মিশ্রণকে নিরুত্সাহিত করা হয় (শর্ত। পাই 3)
glglgl

1
@ হোয়াইটস্কর আমি অজগর 3 এর নতুন সংস্করণগুলি নিয়ে আপ টু ডেট নই, তবে আমি ধরে নিচ্ছি যে এটি এখনও কার্যকর রয়েছে, কেবলমাত্র এই পুরানো বৈশিষ্ট্যগুলির সাথে আপনার এটির দরকার নেই। পাইথন 3 এ, printঅবশ্যই একটি ফাংশন, তবে অন্যান্য বৈশিষ্ট্যগুলিও ব্যবহার করতে পারে __future__। (সম্পাদনা করুন: ডকস.পিথন.আর. / ৩ / লাইব্রেরি /__ফিউচার__ এইচটিএমএল যেখানে এখনও এটি ব্যবহৃত হয় তা দেখুন ))
glglgl

195

যখন তুমি কর

from __future__ import whatever

আপনি আসলে কোনও importবিবৃতি ব্যবহার করছেন না , তবে ভবিষ্যতের বিবৃতি ব্যবহার করছেন । আপনি ভুল দস্তাবেজগুলি পড়ছেন, কারণ আপনি আসলে সেই মডিউলটি আমদানি করছেন না।

ভবিষ্যতের বিবৃতিগুলি বিশেষ - তারা কীভাবে আপনার পাইথন মডিউলটিকে পার্স করা হয় তা পরিবর্তন করে, এজন্য তাদের অবশ্যই ফাইলের শীর্ষে থাকতে হবে। তারা আপনার ফাইলটিতে শব্দ বা চিহ্নকে নতুন - বা আলাদা - অর্থ দেয়। ডক্স থেকে:

ভবিষ্যতের বিবৃতিটি সংকলককে নির্দেশ দেয় যে একটি নির্দিষ্ট মডিউল সিনট্যাক্স বা শব্দার্থ ব্যবহার করে সংকলন করা উচিত যা পাইথনের নির্দিষ্ট ভবিষ্যতে প্রকাশের জন্য উপলব্ধ। ভবিষ্যতের বিবৃতিটি পাইথনের ভবিষ্যতের সংস্করণগুলিতে স্থানান্তরকে স্বাচ্ছন্দিত করার উদ্দেশ্যে তৈরি করা হয়েছে যা ভাষার সাথে অসঙ্গতিপূর্ণ পরিবর্তনগুলি প্রবর্তন করে। এটি রিলিজের আগে বৈশিষ্ট্যটি স্ট্যান্ডার্ড হওয়ার আগে প্রতি মডিউল ভিত্তিতে নতুন বৈশিষ্ট্যগুলি ব্যবহারের অনুমতি দেয়।

আপনি যদি আসলে __future__মডিউলটি আমদানি করতে চান তবে ঠিক করুন just

import __future__

এবং তারপরে এটি যথারীতি অ্যাক্সেস করুন।


4
প্রযুক্তিগতভাবে, এটি একটি আমদানি বিবৃতি, কারণ প্রাসঙ্গিক নামটি স্থানীয় ভেরিয়েবলের সাথে আবদ্ধ। from __future__ import print_functionউভয়ই printprint_function = __import__("__future__").print_function
মূলশব্দটির

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
এটি ব্রাউজার জগতের কোনও পলিফিলের সাথে কিছুটা সাদৃশ্য
cs01

47

এটি এমন বৈশিষ্ট্যগুলি ব্যবহার করতে ব্যবহার করা যেতে পারে যা পাইথনের পুরানো রিলিজ হওয়ার সময় নতুন সংস্করণগুলিতে প্রদর্শিত হবে।

উদাহরণ স্বরূপ

>>> from __future__ import print_function

আপনাকে printএকটি ফাংশন হিসাবে ব্যবহার করার অনুমতি দেবে :

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

29

ইতিমধ্যে কয়েকটি দুর্দান্ত উত্তর রয়েছে, তবে এগুলির মধ্যে কেউই __future__বর্তমানে বিবৃতিটি কী সমর্থন করে তার সম্পূর্ণ তালিকার ঠিকানা দেয় না ।

সহজ কথায় বলতে গেলে, __future__বিবৃতিটি পাইথনের দোভাষীকে ভাষার নতুন বৈশিষ্ট্যগুলি ব্যবহার করতে বাধ্য করে।


বর্তমানে এটি যে বৈশিষ্ট্যগুলি সমর্থন করে তা নিম্নলিখিত:

nested_scopes

পাইথন ২.১ এর আগে, নিম্নলিখিত কোডগুলি একটি নেমরর উত্থাপন করবে :

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

ক্লাসিক বিভাগ পাইথন ২.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। আই / ও ফাইল করার সময় এর সাধারণ ব্যবহারগুলি যেমন:

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__বিবৃতিতে পাইথন ২.১++ দোভাষী ব্যবহার করা প্রয়োজন কারণ পুরানো সংস্করণটি রানটাইম ব্যতিক্রম ছুঁড়ে ফেলবে।


তথ্যসূত্র


ধরে নিচ্ছি যে আপনি অফলাইনে আছেন অজগর কীভাবে জানতে পারে যে ভবিষ্যতের সংস্করণ পাওয়া যায় কি না? এবং যদি আপনি আপনার কম্পিউটারে অজগরটির ভবিষ্যত সংস্করণ ইনস্টল না করে থাকেন তবে এটি কীভাবে ভবিষ্যতের বৈশিষ্ট্যগুলি ব্যবহার করে?
মোহসেন হাদ্দাদি

25

বা এটি বলার মতো এটি "যেহেতু এটি পাইথন ভি ২..7, তাই পাইথন in. যোগ করার পরে এটি পৃথক পৃথক 'মুদ্রণ' ফাংশনটি ব্যবহার করুন যা পাইথন ভি ২..7-এ যুক্ত হয়েছে, সুতরাং আমার 'মুদ্রণ' আর বিবৃতি হবে না (যেমন মুদ্রণ "বার্তা") তবে ফাংশন (যেমন, মুদ্রণ ("বার্তা", বিকল্পসমূহ)) way এভাবে যখন আমার কোডটি অজগর 3 এ চালিত হবে, তখন 'মুদ্রণ' টি ভাঙবে না। "

ভিতরে

from __future__ import print_function

মুদ্রণ_ ফাংশন হ'ল মডিউলটি এটি কীভাবে পাইথন ভি 3-তে আচরণ করছে সে অনুযায়ী 'প্রিন্ট' এর নতুন বাস্তবায়ন সমন্বিত।

এটির আরও ব্যাখ্যা রয়েছে: http://python3porting.com/noconv.html


2

আমি যেগুলি খুব দরকারী বলে মনে করেছি তার মধ্যে একটি print_functionহল __future__মডিউলটি।

পাইথন ২.7-তে, আমি চেয়েছিলাম যে বিভিন্ন মুদ্রণ বিবৃতি থেকে বর্ণগুলি ফাঁকা ছাড়াই একই লাইনে মুদ্রিত করা হোক।

এটি শেষে কমা (",") ব্যবহার করে করা যেতে পারে তবে এটি একটি অতিরিক্ত স্থানও যুক্ত করে। উপরোক্ত বিবৃতি হিসাবে ব্যবহৃত হয়:

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

v_numএটি শূন্যস্থান ছাড়াই একক লাইনে প্রতিটি পুনরাবৃত্তির মান মুদ্রণ করবে ।


-3

পাইথন 3.0.০ এর পরে, মুদ্রণটি এখন আর কোনও বিবৃতি নয়, পরিবর্তে এটি একটি ফাংশন। এবং পিইপি 3105 অন্তর্ভুক্ত করা হয়।

এছাড়াও আমি পাইথন 3.0 প্যাকেজটিতে এখনও এই বিশেষ কার্যকারিতা রয়েছে। পাইথনের একটি traditionalতিহ্যবাহী "পিরামিড প্রোগ্রাম" এর মাধ্যমে এর ব্যবহারযোগ্যতা দেখতে দিন:

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:
*
**
***
****

যদি আমরা সাধারণ মুদ্রণ ফাংশনটি ব্যবহার করি তবে আমরা একই আউটপুট অর্জন করতে পারব না, যেহেতু মুদ্রণ () অতিরিক্ত নিউলাইন নিয়ে আসে। সুতরাং প্রতিবার লুপের জন্য অভ্যন্তরটি কার্যকর হবে, এটি পরের লাইনে * মুদ্রণ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.