পাইথন 3 এর "ফাংশন টিকা" জন্য ভাল ব্যবহারগুলি কী?


159

ফাংশন টিকা: পিইপি -3107

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

কিভাবে এটা কাজ করে:

def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):
    ... function body ...

আর্গুমেন্টের পরে কোলন অনুসরণ করা সমস্ত কিছু হ'ল 'টিকা' এবং নীচের তথ্যগুলি ->ফাংশনের রিটার্ন মানটির জন্য একটি টিকা।

foo.func_annotations একটি অভিধান প্রদান করবে:

{'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

এটি উপলব্ধ থাকার তাৎপর্য কী?



6
@ সাইলেন্টগোস্ট: দুর্ভাগ্যক্রমে, আসল ব্যবহারের ক্ষেত্রে লিঙ্কগুলির অনেকগুলি নষ্ট হয়ে গেছে। এমন কোনও জায়গা আছে যেখানে সামগ্রীটি সঞ্চিত থাকতে পারে, বা এটি চিরতরে চলে গেছে?
সর্বাধিক

16
করা উচিত নয় foo.func_annotations হতে foo.__annotations__python3 মধ্যে?
ঝাংক্সাওচেন

2
টীকাগুলির কোনও বিশেষ সিগনি-ক্যান্সার নেই। পাইথন যা করে তা হ'ল এনেটেশন অভিধানে তাদের রাখ । অন্য কোনও ক্রিয়া আপনার উপর নির্ভর করে।
এন রন্ধাওয়া

কি def foo(a: 'x', b: 5 + 6, c: list) -> max(2, 9):মানে?
আলী এসএচ

উত্তর:


90

আমি মনে করি এটি আসলে দুর্দান্ত।

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

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

আশ্বাসের বাইরে টীকাগুলির জন্য অন্যান্য ব্যবহার রয়েছে। আমি দেখতে পাচ্ছি যে আমি কীভাবে আমার জাভা ভিত্তিক সরঞ্জামগুলি পাইথনে প্রয়োগ করতে পারি। উদাহরণস্বরূপ, আমার কাছে একটি সরঞ্জাম রয়েছে যা আপনাকে পদ্ধতিগুলিতে বিশেষ সতর্কতা বরাদ্দ করতে দেয় এবং আপনি যখন তাদের ডকুমেন্টেশন পড়তে চান তখন আপনাকে ইঙ্গিত দেয় Eg নাম থেকে স্বজ্ঞাত নয়)। টীকা সহ, আমি পাইথনের জন্য প্রযুক্তিগতভাবে এই জাতীয় কিছু লিখতে পারি। একইভাবে, একটি সরঞ্জাম যা ট্যাগগুলির উপর ভিত্তি করে একটি বৃহত শ্রেণিতে পদ্ধতিগুলি সংগঠিত করে সেখানে অফিসিয়াল সিনট্যাক্স থাকলে লেখা যেতে পারে।


34
আইএসটিএম এগুলি তাত্ত্বিক সুবিধাগুলি কেবল তখনই উপলব্ধি করা যায় যদি স্ট্যান্ডার্ড লাইব্রেরি এবং তৃতীয় পক্ষের মডিউলগুলি সমস্ত ফাংশন টীকাগুলি ব্যবহার করে এবং এগুলি ধারাবাহিক অর্থ সহ ব্যবহার করে এবং টীকাগুলির একটি সুচিন্তিত সিস্টেম ব্যবহার করে। সেদিন পর্যন্ত (যা কখনই আসবে না), পাইথনের ফাংশন টীকাগুলির প্রধান ব্যবহারগুলি অন্যান্য উত্তরে বর্ণিত এক-বন্ধ ব্যবহারগুলি হবে। আপাতত, আপনি স্মার্ট স্ট্যাটিক বিশ্লেষক, সংকলক নিশ্চয়তা, জাভা-ভিত্তিক সরঞ্জাম চেইন ইত্যাদির কথা ভুলে যেতে পারেন
রেমন্ড হেটিঙ্গার

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

1
আফ্রিএফট, আপনি ডেকোরেটর দিয়ে এগুলি সব করতে পারেন, যা টীকাগুলির পূর্বাভাস দেয়; অতএব, আমি এখনও সুবিধাটি দেখতে পাচ্ছি না। : আমি এই প্রশ্নে একটি কিছুটা ভিন্ন নিতে stackoverflow.com/questions/13784713/...
allyourcode

9
২০১৫-তে দ্রুত অগ্রগামী, পাইথন.আর / দেবদেবী / পেপস / পেপ ০৪৪৪৫ এবং মাইপিএলং.আর.জি সকল নায়েসারকে ভুল প্রমাণ করতে শুরু করেছে।
মৌরিসিও শেফার

1
এটি আরও বেশি সুইফটে পাইথন প্রভাবকে প্রকাশ করে।
উছুগাকা

92

ফাংশন টীকাগুলি যা সেগুলি করে।

এগুলি ডকুমেন্টেশনের জন্য ব্যবহার করা যেতে পারে:

def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second'):
     ...

এগুলি প্রাক-শর্ত পরীক্ষার জন্য ব্যবহার করা যেতে পারে:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        msg = 'Var: {0}\tValue: {1}\tTest: {2.__name__}'.format(var, value, test)
        assert test(value), msg


def is_int(x):
    return isinstance(x, int)

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    return _between

def f(x: between(3, 10), y: is_int):
    validate(f, locals())
    print(x, y)


>>> f(0, 31.1)
Traceback (most recent call last):
   ... 
AssertionError: Var: y  Value: 31.1 Test: is_int

টাইপ চেকিং বাস্তবায়নের জন্য http://www.python.org/dev/peps/pep-0362/ দেখুন ।


18
ডকুমেন্টেশন, বা ফাংশনে সুস্পষ্ট ধরণের চেকিংয়ের জন্য এটি কীভাবে ডাস্ট্রিংয়ের চেয়ে ভাল? এটি অকারণে ভাষাটিকে জটিল করে দেখায়।
এন্ডোলিথ

10
@endolith আমরা অবশ্যই ফাংশন টীকা ছাড়াই করতে পারি। তারা টীকাগুলি অ্যাক্সেসের জন্য কেবল স্ট্যান্ডার্ড উপায় সরবরাহ করে। এটি তাদের সহায়তা () এবং সরঞ্জাম-টিপসগুলিতে অ্যাক্সেসযোগ্য করে তোলে এবং তাদেরকে অন্তঃকরণের জন্য উপলব্ধ করে তোলে।
রেমন্ড হেটেঞ্জার

4
পরিবর্তে সংখ্যাগুলির পাশ করার পরিবর্তে আপনি প্রকারগুলি তৈরি করতে পারেন Massএবং Velocityপরিবর্তে।
রাইটফোল্ড

1
এটি পুরোপুরি প্রদর্শনের জন্য আমাকে def kinetic_energy(mass: 'in kilograms', velocity: 'in meters per second') -> float:রিটার্নের ধরণটিও প্রদর্শন করতে হবে। এটি এখানে আমার প্রিয় উত্তর।
টমি

আপনার কোড ব্যবহার করে, returnটীকা যাচাই করার কোনও উপায় আছে ? দেখে মনে হচ্ছে নাlocals
ব্যবহারকারী 189728

46

এটি একদম দেরিতে উত্তর, তবে AFAICT, ফাংশন টীকাগুলির সেরা বর্তমান ব্যবহার হল PEP-0484 এবং MyPy

মাইপি পাইথনের জন্য একটি anচ্ছিক স্ট্যাটিক ধরণের পরীক্ষক। পাইথন ৩.৫ বিটা 1 (পিইপি 484) তে প্রবর্তিত টাইপ টীকাগুলির জন্য আসন্ন স্ট্যান্ডার্ডটি ব্যবহার করে আপনি আপনার পাইথন প্রোগ্রামগুলিতে টাইপ ইঙ্গিতগুলি যুক্ত করতে পারেন এবং এগুলি স্থিরভাবে পরীক্ষা করতে মাইপি ব্যবহার করতে পারেন।

এর মতো ব্যবহৃত:

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b


আরো দেখুন pytype - অন্য স্ট্যাটিক বিশ্লেষক PEP-0484 মাথায় রেখে নির্মিত হচ্ছে।
জিপিএস

দুর্ভাগ্যক্রমে টাইপটি প্রয়োগ করা হয়নি। যদি আমি list(fib('a'))আপনার উদাহরণের ফাংশনটি টাইপ করি তবে পাইথন ৩.7 আনন্দের সাথে যুক্তিটি গ্রহণ করে এবং কোনও স্ট্রিং এবং কোনও ইন্টের তুলনা করার উপায় নেই বলে অভিযোগ করে।
ডেনিস ডি বার্নার্ডি

@ ডেনিসেডবার্নার্ডি যেমন পিইপি -৪৪৪ ব্যাখ্যা করে পাইথন কেবল ধরণের টীকাগুলি সরবরাহ করে। ধরণের প্রয়োগ করতে আপনাকে মাইপি ব্যবহার করতে হবে।
ডাস্টিন ওয়াইট

23

এখানে আমার উত্তর থেকে ভাল ব্যবহারের একটি নির্দিষ্ট উদাহরণ যুক্ত করতে সজ্জাকারীর সাথে মিলিত করে মাল্টিমেডথসের জন্য একটি সহজ প্রক্রিয়া করা যেতে পারে।

# This is in the 'mm' module

registry = {}
import inspect

class MultiMethod(object):
    def __init__(self, name):
        self.name = name
        self.typemap = {}
    def __call__(self, *args):
        types = tuple(arg.__class__ for arg in args) # a generator expression!
        function = self.typemap.get(types)
        if function is None:
            raise TypeError("no match")
        return function(*args)
    def register(self, types, function):
        if types in self.typemap:
            raise TypeError("duplicate registration")
        self.typemap[types] = function

def multimethod(function):
    name = function.__name__
    mm = registry.get(name)
    if mm is None:
        mm = registry[name] = MultiMethod(name)
    spec = inspect.getfullargspec(function)
    types = tuple(spec.annotations[x] for x in spec.args)
    mm.register(types, function)
    return mm

এবং ব্যবহারের একটি উদাহরণ:

from mm import multimethod

@multimethod
def foo(a: int):
    return "an int"

@multimethod
def foo(a: int, b: str):
    return "an int and a string"

if __name__ == '__main__':
    print("foo(1,'a') = {}".format(foo(1,'a')))
    print("foo(7) = {}".format(foo(7)))

এটি গিডোর মূল পোস্ট শো হিসাবে সাজসজ্জারে প্রকারগুলি যুক্ত করে করা যেতে পারে , তবে পরামিতিগুলি উল্লেখ করা ভাল কারণ এটি প্যারামিটার এবং প্রকারগুলির সাথে ভুল মিলের সম্ভাবনা এড়িয়ে চলে।

দ্রষ্টব্য : পাইথনটিতে আপনি স্টাইলটি পাইথন 3-এ সরিয়ে দেওয়ার function.__annotations__পরিবর্তে টীকাগুলি অ্যাক্সেস করতে পারবেন ।function.func_annotationsfunc_*


2
আকর্ষণীয় অ্যাপ্লিকেশন, যদিও আমি ভয় করি function = self.typemap.get(types)সাবক্লাসগুলি জড়িত থাকলে কাজ করবে না। সেক্ষেত্রে আপনাকে সম্ভবত typemapব্যবহারের মাধ্যমে লুপ করতে হবে isinnstance। আমি ভাবছি যদি @overloadএটি সঠিকভাবে পরিচালনা করে
টোবিয়াস কেইনজলার

আমি মনে করি যদি ফাংশনটির একটি রিটার্ন টাইপ থাকে তবে এটি ভাঙ্গা হবে
zenna

1
__annotations__ একটি হল dictতাই এই স্নিপেট কখনও কখনও ব্যর্থ, যে আর্গুমেন্ট নিশ্চিত করে না। আমি পরিবর্তন সুপারিশ করবে types = tuple(...)করার spec = inspect.getfullargspec(function)তারপর types = tuple([spec.annotations[x] for x in spec.args])
xoolive

আপনি যথেষ্ট সঠিক, @ শান্ত। কেন আপনি নিজের সংশোধন করার জন্য উত্তরটি সম্পাদনা করবেন না?
মুহাম্মদ আলকারৌরি

@ চঞ্চল: আমি লক্ষ্য করেছি। কখনও কখনও সম্পাদনাগুলি সম্পাদনাগুলি পরিচালনা করতে ভারী হাত ব্যবহার করে। আপনার সমাধানটি অন্তর্ভুক্ত করার জন্য আমি প্রশ্নটি সম্পাদনা করেছি। প্রকৃতপক্ষে, আমি এ সম্পর্কে আলোচনা করেছি , তবে সমাধানটি বাতিল করে দেওয়ার কোনও উপায় নেই। উপায় সাহায্যের জন্য ধন্যবাদ।
মুহাম্মদ আলকারৌরি

22

উরি ইতিমধ্যে একটি সঠিক উত্তর দিয়েছে, সুতরাং এখানে একটি কম গুরুতর উত্তর দেওয়া হয়েছে: সুতরাং আপনি আপনার ডকাস্ট্রিংগুলি আরও খাটো করতে পারেন।


2
এটা ভালবাসা। +1 টি। যাইহোক, শেষ পর্যন্ত, ডকাস্ট্রিংগুলি লিখতে এখনও আমার কোডটি পাঠযোগ্যযোগ্য এক নম্বর উপায়, তবে আপনি যদি কোনও ধরণের স্থিতিশীল বা গতিশীল চেকিং প্রয়োগ করেন তবে এটি ভাল লাগবে। সম্ভবত আমি এটির জন্য একটি ব্যবহার পেতে পারেন।
ওয়ারেন পি

8
আমি আরোগুলির জন্য প্রতিস্থাপন হিসাবে টীকাগুলি ব্যবহার করার পরামর্শ দিচ্ছি না: বিভাগ বা @ পরিমাপক লাইনগুলি বা আপনার ডকাস্ট্রিংগুলিতে অনুরূপ (আপনি যে ফর্ম্যাটটি বেছে নিতে বেছে নিন)। ডকুমেন্টেশন টীকাগুলি দুর্দান্ত উদাহরণ হিসাবে দেখায়, এটি এনোটেশনগুলির সম্ভাব্য শক্তিটিকে নষ্ট করে দেয় কারণ এটি অন্যান্য আরও শক্তিশালী ব্যবহারের পথে পেতে পারে। এছাড়াও, ডকাস্ট্রিংস সহ স্টেটমেন্ট জোর দিয়ে মেমরির খরচ (পাইথন-ওও) হ্রাস করতে আপনি রানটাইম এ টীকা বাদ দিতে পারবেন না।
জিপিএস

2
@ জিপিএস: যেমনটি আমি বলেছিলাম, এটি কম গুরুতর উত্তর ছিল।
জ্যাব

2
সমস্ত গুরুত্বের সাথে ডকটাইপিং মেনে চলার সময় আপনি যে ধরণের প্রত্যাশা করেছেন তা নথিভুক্ত করার পক্ষে এটি আরও ভাল উপায়।
মার্ক

1
@gps আমি নিশ্চিত নই যে ডকস্টরিংগুলির মেমরির খরচ 99.999% ক্ষেত্রে উদ্বেগজনক।
টমি

13

প্রথমবার আমি টীকাগুলি দেখেছি, আমি ভেবেছিলাম "দুর্দান্ত! অবশেষে আমি কোনও ধরণের চেকিং বেছে নিতে পারি!" অবশ্যই, আমি লক্ষ্য করিনি যে টীকাগুলি আসলে প্রয়োগ করা হয় না।

সুতরাং আমি তাদের কার্যকর করার জন্য একটি সাধারণ ফাংশন ডেকরেটার লিখার সিদ্ধান্ত নিয়েছি :

def ensure_annotations(f):
    from functools import wraps
    from inspect import getcallargs
    @wraps(f)
    def wrapper(*args, **kwargs):
        for arg, val in getcallargs(f, *args, **kwargs).items():
            if arg in f.__annotations__:
                templ = f.__annotations__[arg]
                msg = "Argument {arg} to {f} does not match annotation type {t}"
                Check(val).is_a(templ).or_raise(EnsureError, msg.format(arg=arg, f=f, t=templ))
        return_val = f(*args, **kwargs)
        if 'return' in f.__annotations__:
            templ = f.__annotations__['return']
            msg = "Return value of {f} does not match annotation type {t}"
            Check(return_val).is_a(templ).or_raise(EnsureError, msg.format(f=f, t=templ))
        return return_val
    return wrapper

@ensure_annotations
def f(x: int, y: float) -> float:
    return x+y

print(f(1, y=2.2))

>>> 3.2

print(f(1, y=2))

>>> ensure.EnsureError: Argument y to <function f at 0x109b7c710> does not match annotation type <class 'float'>

আমি এটিকে নিশ্চিত লাইব্রেরিতে যুক্ত করেছি।


পাইথনকে অবশেষে বিশ্বাস করে বেরিয়ে আসার পরে আমার একই হতাশা রয়েছে শেষ পর্যন্ত টাইপ চেকিং রয়েছে। অবশেষে house বাড়ির সাথে ‑ তৈরি প্রকারের চেক প্রয়োগ করতে হবে।
Hibou57

3

এটি জিজ্ঞাসা করার পরে এটি অনেক দিন হয়েছে তবে প্রশ্নে দেওয়া উদাহরণ স্নিপেটটি (যেমন সেখানে বর্ণিত হয়েছে) পিইপি 3107 থেকে এবং থস পিইপি উদাহরণের শেষে ব্যবহারের কেসগুলিও দেওয়া হয় যা পিইপিস পয়েন্ট থেকে প্রশ্নের উত্তর দিতে পারে দেখুন;)

নীচে PEP3107 থেকে উদ্ধৃত করা হয়েছে

ব্যবহারের ক্ষেত্রে

টীকাগুলি নিয়ে আলোচনা করার সময়, বেশ কয়েকটি ব্যবহারের ক্ষেত্রে উত্থাপিত হয়েছে। এর মধ্যে কিছু এখানে উপস্থাপন করা হয়েছে, তারা কী ধরণের তথ্য সরবরাহ করে তা গোষ্ঠীযুক্ত। এছাড়াও বিদ্যমান পণ্য এবং প্যাকেজগুলির উদাহরণ রয়েছে যা টীকাগুলির ব্যবহার করতে পারে।

  • টাইপিংয়ের তথ্য সরবরাহ করা
    • টাইপ চেকিং ([3], [4])
    • আইডিইগুলিকে কোন ফাংশনটি কী ধরণের প্রত্যাশা করে এবং কী ফেরত দেয় তা দেখান ([17])
    • ফাংশন ওভারলোডিং / জেনেরিক ফাংশন ([22])
    • বিদেশী ভাষার সেতুগুলি ([18], [19])
    • অভিযোজন ([21], [20])
    • যুক্তি ফাংশন পূর্বাভাস
    • ডাটাবেস ক্যোয়ারী ম্যাপিং
    • আরপিসি প্যারামিটার মার্শালিং ([23])
  • অন্যান্য তথ্য
    • প্যারামিটার এবং রিটার্ন মানগুলির জন্য ডকুমেন্টেশন ([24])

নির্দিষ্ট পয়েন্টগুলিতে আরও তথ্যের জন্য PEP দেখুন (পাশাপাশি তাদের উল্লেখগুলি)


ডাউনভোটরা যদি কমপক্ষে একটি সংক্ষিপ্ত মন্তব্য দেয় তবে ডাউনটা কী কারণে হয়েছিল তা আমি সত্যিই উপলব্ধি করব। এটি সত্যিকারের (কমপক্ষে আমাকে) উন্নতি করতে অনেক সাহায্য করবে।
ক্লাস

2

পাইথন ৩. এক্স (কেবল) এক্সটেনশানগুলিতে ব্যবহারের জন্য অবজেক্ট ভ্যালু দিয়ে আর্গুমেন্ট এবং রিটার্ন মানগুলিকে টীকায়িত করার অনুমতি দেওয়ার জন্য ফাংশন সংজ্ঞাটিকেও সাধারণ করে তোলে ।

ফাংশনের মানগুলি সম্পর্কে আরও স্পষ্ট করার জন্য এটির মেটা-ডেটা ব্যাখ্যা করা।

টীকাগুলি :valueআর্গুমেন্টের নাম এবং একটি ডিফল্টর আগে এবং ->valueআর্গুমেন্ট তালিকার মতো কোড করা হয়।

এগুলি __annotations__ফাংশনটির একটি বৈশিষ্ট্যে সংগ্রহ করা হয়, তবে পাইথন নিজেই বিশেষ হিসাবে বিবেচিত হয় না:

>>> def f(a:99, b:'spam'=None) -> float:
... print(a, b)
...
>>> f(88)
88 None
>>> f.__annotations__
{'a': 99, 'b': 'spam', 'return': <class 'float'>}

সূত্র: পাইথন পকেট রেফারেন্স, পঞ্চম সংস্করণ

উদাহরণ:

typeannotationsমডিউল টাইপ পরীক্ষণ এবং পাইথন কোড ধরণ অনুমান জন্য সরঞ্জাম একটি সেট প্রদান করে। এটি ফাংশন এবং অবজেক্টগুলিকে টীকা দেওয়ার জন্য দরকারী ধরণের একটি সেট সরবরাহ করে।

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

https://github.com/ceronman/typeannotations

কীভাবে টাইপিং আরও ভাল কোড লিখতে সহায়তা করে

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

পাইথন পরিষ্কার করুন: পাইথনে মার্জিত কোডিং ISBN: ISBN-13 (pbk): 978-1-4842-4877-5

পিইপি 526 - চলক টীকাগুলির জন্য সিনট্যাক্স

https://www.python.org/dev/peps/pep-0526/

https://www.attrs.org/en/stable/types.html


@ ব্ল্যাকজ্যাক, "এক্সটেনশনে ব্যবহারের জন্য" পরিষ্কার ছিল না?
ডেমজ

এটি পরিষ্কার, কিন্তু আইএমএইচও প্রশ্নের উত্তর দেয় না। এটি হবে "প্রোগ্রামে ব্যবহারের জন্য।" এটা স্পষ্ট, সঠিক সঙ্গে উত্তর মত "কি ক্লাস ভাল ব্যবহার হয়?", কিন্তু জিজ্ঞাসা পার্টি সত্যিই কি নরক ভাল হিসেবে তিমিরে নয় কংক্রিট ব্যবহার রয়েছে। আপনার একটি উত্তর যা আরও জেনেরিক হতে পারে না, উদাহরণস্বরূপ যা ইতিমধ্যে প্রশ্নটির মধ্যে একই রকম ।
ব্ল্যাকজ্যাক

1

এখানে বর্ণিত সমস্ত ব্যবহার সত্ত্বেও, একটি প্রয়োগযোগ্য এবং সম্ভবত, টীকাগুলির প্রয়োগ করা কার্যকর টাইপ ইঙ্গিতগুলির জন্য

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

উদ্ধৃতি দেওয়া টীকা বিদ্যমান ব্যবহার সম্পর্কে কি? :

আমরা আশা করি টাইপ ইঙ্গিতগুলি শেষ পর্যন্ত টীকাগুলির জন্য একমাত্র ব্যবহারে পরিণত হবে, তবে পাইথন 3.5 এর সাথে টাইপিং মডিউলের প্রাথমিক রোল আউট হওয়ার পরে এটির জন্য অতিরিক্ত আলোচনা এবং অবমূল্যায়নের সময় প্রয়োজন। পাইথন ৩.6 প্রকাশ না হওয়া পর্যন্ত বর্তমান পিইপির অস্থায়ী স্থিতি থাকবে (পিইপি 411 দেখুন)। দ্রুততম কল্পনাযোগ্য স্কিমটি 3.6-এ টাইপ-হিন্ট টীকাগুলির নীরব অবমূল্যায়ন, 3.7-এ সম্পূর্ণ অবমূল্যায়ন এবং পাইথন ৩.৮-এ টীকাগুলির একমাত্র অনুমোদিত ব্যবহার হিসাবে প্রকারের ইঙ্গিতগুলিকে ঘোষণা করবে।

যদিও আমি এখনও 3.6-এ কোনও নীরব অবচয় দেখিনি, তবে এর পরিবর্তে এটি খুব ভালভাবে 3.7 এ বাম্প করা যেতে পারে।

সুতরাং, যদিও আরও কিছু ভাল ব্যবহারের ক্ষেত্রেও থাকতে পারে, তবে যদি আপনি এই বিধিনিষেধটি যেখানে রয়েছে সেখানে ভবিষ্যতে সমস্ত কিছু পরিবর্তনের দিকে যেতে না চান তবে তাদের কেবল টাইপ হিন্টিংয়ের জন্য রাখা ভাল।


1

কিছুটা বিলম্বিত উত্তর হিসাবে, আমার বেশ কয়েকটি প্যাকেজ (ম্যারো.স্ক্রিপ্ট, ওয়েবকোর ইত্যাদি) টাইপকাস্টিং ঘোষণা করার জন্য উপলভ্য যেখানে টেক্সট ব্যবহার করে (যেমন ওয়েব থেকে আগত মানগুলিকে রূপান্তর করা, কোন আর্গুমেন্ট বুলিয়ান সুইচ ইত্যাদি সনাক্ত করে) পাশাপাশি packages যুক্তি অতিরিক্ত মার্কআপ সঞ্চালন হিসাবে।

ম্যারো স্ক্রিপ্ট স্বেচ্ছাসেবী ফাংশন এবং ক্লাসে একটি সম্পূর্ণ কমান্ড-লাইন ইন্টারফেস তৈরি করে এবং ডকুমেন্টার সহ পুরানো রানটাইম সমর্থন করার জন্য ডকুমেন্টেশন, castালাই এবং কলব্যাক থেকে প্রাপ্ত ডিফল্ট মানগুলি সংজ্ঞা দিয়ে দেয় allows আমার সমস্ত লাইব্রেরি যা টীকাগুলি ব্যবহার করে ফর্মগুলি সমর্থন করে:

any_string  # documentation
any_callable  # typecast / callback, not called if defaulting
(any_callable, any_string)  # combination
AnnotationClass()  # package-specific rich annotation object
[AnnotationClass(), AnnotationClass(), …]  # cooperative annotation

ডকাস্ট্রিংস বা টাইপকাস্টিং ফাংশনগুলির জন্য "বেয়ার" সমর্থন এনটোটেশন-সচেতন এমন অন্যান্য লাইব্রেরির সাথে আরও সহজে মেশার অনুমতি দেয়। (অর্থাত্ টাইপকাস্টিং ব্যবহার করে এমন একটি ওয়েব কন্ট্রোলার রয়েছে যা কমান্ড-লাইন স্ক্রিপ্ট হিসাবে প্রকাশিত হয়))

যুক্ত করার জন্য সম্পাদিত: আমি বৈধতার জন্য ডেভলপমেন্ট-টাইম এ্যাসারেন্স ব্যবহার করে টাইপগার্ড প্যাকেজটিও ব্যবহার শুরু করেছি । উপকার: যখন "অপ্টিমাইজেশান" সক্ষম ( -O/ PYTHONOPTIMIZEএনভির ভার) সাথে চালানো হয় তখন ব্যয়বহুল (যেমন পুনরাবৃত্ত হওয়া) বাদ দিতে পারে, এই ধারণাটি নিয়ে আপনি আপনার অ্যাপ্লিকেশনটিকে বিকাশে সঠিকভাবে পরীক্ষা করেছেন যাতে চেকগুলি উত্পাদন ক্ষেত্রে অপ্রয়োজনীয় হতে পারে।


-2

কোডগুলি সহজেই সংশোধন কোডের জন্য ব্যবহার করা যেতে পারে not যেমন আমি বজায় রাখছি এমন একটি প্রোগ্রামের একটি মডিউল কেবল একটি পদ্ধতিটির সংজ্ঞা দিতে পারে:

def run(param1: int):
    """
    Does things.

    :param param1: Needed for counting.
    """
    pass

এবং আমরা ব্যবহারকারীকে "প্যারাম 1" নামক একটি জিনিস জিজ্ঞাসা করতে পারি যা "গণনার জন্য প্রয়োজনীয়" এবং এটি একটি "অন্তর্নিহিত" হওয়া উচিত। সর্বাধিক ঝামেলা মুক্ত অভিজ্ঞতা পেতে আমরা শেষ পর্যন্ত ব্যবহারকারীর দেওয়া স্ট্রিংকে পছন্দসই ধরণের রূপান্তর করতে পারি।

ওপেন সোর্স শ্রেণীর জন্য আমাদের ফাংশন মেটাডেটা অবজেক্টটি দেখুন যা এটির সাথে সহায়তা করে এবং প্রয়োজনীয় মানগুলি স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করতে এবং এগুলিকে যে কোনও পছন্দসই ধরণের রূপান্তর করতে পারে (কারণ টীকাটি রূপান্তর পদ্ধতি)। এমনকি আইডিইগুলি স্বতঃপূরণগুলি ডানদিকে দেখায় এবং ধরে নেয় যে প্রকারগুলি টীকা অনুসারে হয় - একটি নিখুঁত ফিট।


-2

আপনি যদি সিথনের সুবিধাগুলির তালিকার দিকে লক্ষ্য করেন তবে একটি প্রধান হ'ল পাইথন অবজেক্টটি কোন ধরণের তা সংকলকটি বলার ক্ষমতা।

আমি এমন ভবিষ্যতের কথা কল্পনা করতে পারি যেখানে সিথন (বা অনুরূপ সরঞ্জামগুলি যা আপনার পাইথন কোডের কয়েকটি সংকলন করে) তাদের যাদু করার জন্য টীকাটি বাক্য গঠন ব্যবহার করবে।


RPython টিকা রচনা একটি পন্থা যে উপযুক্ত মতানুযায়ী Pythonic একটি উদাহরণ; আপনার অ্যাপ্লিকেশনটির একটি গ্রাফ তৈরি করার পরে, এটি প্রতিটি ভেরিয়েবলের ধরণের কাজ করতে পারে এবং (RPython এর জন্য) একক ধরণের সুরক্ষা প্রয়োগ করে। গতিশীল সমৃদ্ধ মূল্যবোধগুলির জন্য এটির জন্য "বক্সিং" বা অন্যান্য সমাধান / ওয়ার্ক-এ্যোভারস প্রয়োজন। আমি পুরোপুরি বৈধ multiplyহলে আমার ফাংশনটি কেবলমাত্র পূর্ণসংখ্যার বিরুদ্ধে কাজ করতে বাধ্য করব 'na' * 8 + ' batman!'? ;)
amcgregor
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.