পাইথন ফাংশন সংজ্ঞায় -> এর অর্থ কী?


475

পাইথন ৩.৩ ব্যাকরণের স্পেসিফিকেশনটি দেখার সময় আমি সম্প্রতি আকর্ষণীয় কিছু লক্ষ্য করেছি :

funcdef: 'def' NAME parameters ['->' test] ':' suite

পাইথন 2 এ alচ্ছিক 'তীর' ব্লকটি অনুপস্থিত ছিল এবং পাইথন 3 -তে এর অর্থ সম্পর্কিত কোনও তথ্য আমি পাইনি It এটি প্রমাণ করে যে এটি সঠিক পাইথন এবং এটি দোভাষী দ্বারা গ্রহণ করা হয়েছে:

def f(x) -> 123:
    return x

আমি ভেবেছিলাম যে এটি কোনও এক পূর্ব শর্ত সিনট্যাক্স হতে পারে তবে:

  • আমি xএখানে পরীক্ষা করতে পারি না , এটি এখনও অপরিজ্ঞাত,
  • আমি তীর (উদাহরণস্বরূপ 2 < 1) পরে যা কিছু রেখেছি তা কার্যকরভাবে প্রভাবিত করে না।

এই সিনট্যাক্সের সাথে অভ্যস্ত যে কেউ এটি ব্যাখ্যা করতে পারে?

উত্তর:


374

এটি একটি ফাংশন টীকা

আরও বিশদে, পাইথন ২.x এর ডকাস্ট্রিং রয়েছে যা আপনাকে বিভিন্ন ধরণের অবজেক্টের সাথে একটি মেটাডেটা স্ট্রিং সংযুক্ত করতে দেয়। এটি আশ্চর্যজনকভাবে কার্যকর, তাই পাইথন 3 আপনাকে তাদের প্যারামিটারগুলি এবং ফেরতের মানগুলি বর্ণনা করে ফাংশনে মেটাডেটা সংযুক্ত করার অনুমতি দিয়ে বৈশিষ্ট্যটি প্রসারিত করে।

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


122
এবং তথ্য একটি .__annotations__বৈশিষ্ট্য হিসাবে উপলব্ধ ।
মার্টিজন পিটারস

8
বাহ, আমি জ্ঞানের বেশ বিস্তৃত ক্ষেত্রটি মিস করেছি - মানের টীকাগুলি কেবল ফেরত দেয় না, তবে পরামিতি টীকাও। আপনাকে অনেক ধন্যবাদ :).
কৃষ্ণ

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

5
এবং __annotations__বৈশিষ্ট্যটি একটি অভিধান। returnতীরের পরে মানটি পুনরুদ্ধার করতে কীটি ব্যবহৃত হয়।
কিথ

9
@ ডেলানান - সম্ভবত এটি বেশিরভাগ অব্যবহৃত কারণ সম্ভবত বেশিরভাগ পাইথন লাইব্রেরি অজগর 2.x এর সাথে সামঞ্জস্যপূর্ণ হওয়ার লক্ষ্য রাখে। পাইথন ৩.x আরও স্ট্যান্ডার্ড হতে শুরু করার সাথে সাথে আমরা আরও এই জিনিসগুলি এখানে এবং সেখানে উঠতে দেখতে পারি ...
ম্যাগসিলসন

251

এগুলি পিইপি 3107-তে আচ্ছাদিত ফাংশন টীকাগুলি । বিশেষত, ->রিটার্ন ফাংশন টীকা চিহ্নিত করে।

উদাহরণ:

>>> def kinetic_energy(m:'in KG', v:'in M/S')->'Joules': 
...    return 1/2*m*v**2
... 
>>> kinetic_energy.__annotations__
{'return': 'Joules', 'v': 'in M/S', 'm': 'in KG'}

টীকাগুলি অভিধান, তাই আপনি এটি করতে পারেন:

>>> '{:,} {}'.format(kinetic_energy(20,3000),
      kinetic_energy.__annotations__['return'])
'90,000,000.0 Joules'

আপনার কাছে কেবল স্ট্রিংয়ের পরিবর্তে পাইথন ডেটা কাঠামো থাকতে পারে:

>>> rd={'type':float,'units':'Joules','docstring':'Given mass and velocity returns kinetic energy in Joules'}
>>> def f()->rd:
...    pass
>>> f.__annotations__['return']['type']
<class 'float'>
>>> f.__annotations__['return']['units']
'Joules'
>>> f.__annotations__['return']['docstring']
'Given mass and velocity returns kinetic energy in Joules'

বা, আপনি ডাকা মানগুলি যাচাই করতে ফাংশন বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন:

def validate(func, locals):
    for var, test in func.__annotations__.items():
        value = locals[var]
        try: 
            pr=test.__name__+': '+test.__docstring__
        except AttributeError:
            pr=test.__name__   
        msg = '{}=={}; Test: {}'.format(var, value, pr)
        assert test(value), msg

def between(lo, hi):
    def _between(x):
            return lo <= x <= hi
    _between.__docstring__='must be between {} and {}'.format(lo,hi)       
    return _between

def f(x: between(3,10), y:lambda _y: isinstance(_y,int)):
    validate(f, locals())
    print(x,y)

ছাপে

>>> f(2,2) 
AssertionError: x==2; Test: _between: must be between 3 and 10
>>> f(3,2.1)
AssertionError: y==2.1; Test: <lambda>

86

অন্যান্য উত্তর যেমনটি বলেছে, ->প্রতীকটি ফাংশন টীকাগুলির অংশ হিসাবে ব্যবহৃত হয়। পাইথনের আরও সাম্প্রতিক সংস্করণগুলিতে >= 3.5যদিও এর একটি সংজ্ঞায়িত অর্থ রয়েছে।

পিইপি 3107 - ফাংশন টীকাগুলি স্পেসিফিকেশন বর্ণনা করেছে, ব্যাকরণ পরিবর্তনগুলি সংজ্ঞায়িত করেছে, func.__annotations__তারা যেগুলি সংরক্ষণ করে সেটির অস্তিত্ব এবং, এটির ব্যবহারের বিষয়টি এখনও উন্মুক্ত।

পাইথনে 3.5যদিও, পিইপি 484 - টাইপ ইঙ্গিতগুলি এর একক অর্থ সংযুক্ত করে: ->ফাংশনটি যে ধরণের প্রত্যাবর্তন করে তা নির্দেশ করতে ব্যবহৃত হয়। দেখে মনে হয় এটি ভবিষ্যতের সংস্করণগুলিতে প্রয়োগ করা হবে যেমন টীকাগুলির বিদ্যমান ব্যবহারগুলি সম্পর্কে বর্ণিত হয়েছে :

দ্রুততম কল্পনাযোগ্য স্কিমটি 3.6-এ টাইপ-হিন্ট টীকাগুলির নীরব অবমূল্যায়ন, 3.7-এ সম্পূর্ণ অবমূল্যায়ন এবং পাইথন ৩.৮-এ টীকাগুলির একমাত্র অনুমোদিত ব্যবহার হিসাবে প্রকারের ইঙ্গিতগুলিকে ঘোষণা করবে।

(জোর আমার)

এটি 3.6যতদূর আমি বলতে পারি যতটা বাস্তবায়িত হয় নি তাই এটি ভবিষ্যতের সংস্করণগুলিতে ঝাপসা হতে পারে।

এটি অনুসারে, আপনি যে উদাহরণ সরবরাহ করেছেন:

def f(x) -> 123:
    return x

ভবিষ্যতে নিষিদ্ধ করা হবে (এবং বর্তমান সংস্করণগুলিতে বিভ্রান্তিকর হবে), এটিতে এটি পরিবর্তন করা দরকার:

def f(x) -> int:
    return x

এটি কার্যকরভাবে বর্ণনা করতে পারে যে ফাংশন fটাইপের একটি বস্তু প্রদান করে int

টীকাগুলি পাইথন নিজেই কোনও উপায়ে ব্যবহার করে না, এটি এটিকে অনেক বেশি জনপ্রিয় করে তোলে এবং উপেক্ষা করে। তাদের সাথে কাজ করার জন্য এটি তৃতীয় পক্ষের লাইব্রেরি।


64

নিম্নলিখিত কোডে:

def f(x) -> int:
    return int(x)

-> intশুধু বলে যে f()একটি পূর্ণসংখ্যা ফেরৎ (কিন্তু এটি একটি পূর্ণসংখ্যা ফিরে যাওয়ার ফাংশন জোর করে না)। এটিকে রিটার্ন টীকা বলা হয় এবং এটি অ্যাক্সেস করা যায় f.__annotations__['return']

পাইথন প্যারামিটার টীকাগুলিকে সমর্থন করে:

def f(x: float) -> int:
    return int(x)

: floatপ্রোগ্রামটি পড়া লোকেদের (এবং কিছু তৃতীয় পক্ষের লাইব্রেরি / প্রোগ্রামগুলি, উদাহরণস্বরূপ পাইলেন্ট) কে বলে যে এটি xহওয়া উচিত float। এটি হিসাবে অ্যাক্সেস করা হয়েছে f.__annotations__['x'], এবং নিজেই এর কোনও অর্থ নেই। আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন:

https://docs.python.org/3/references/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/


4

এর অর্থ ফাংশনটি যে ধরণের ফলাফলের প্রত্যাশায় আসে তা কিন্তু এটি হতে পারে None

পাইথন ৩.x ভিত্তিক আধুনিক গ্রন্থাগারগুলিতে এটি বিস্তৃত is

উদাহরণস্বরূপ, এটি লাইব্রেরির পান্ডাস-প্রোফাইলের কোডে অনেক জায়গায় রয়েছে:

def get_description(self) -> dict:

def get_rejected_variables(self, threshold: float = 0.9) -> list:

def to_file(self, output_file: Path or str, silent: bool = True) -> None:
"""Write the report to a file.

"এর অর্থ ফাংশনটি যে ফলাফলের ফলাফল দেয় তা বোঝায় তবে এটি কোনওটিই হতে পারে না।" এটি কোনও বা অন্য কোনও ধরণের হতে পারে।
ইব্রাম শেহাতা

2

def function(arg)->123:

এটি কেবল একটি রিটার্নের ধরণ, এক্ষেত্রে পূর্ণসংখ্যার ক্ষেত্রে আপনি কোন সংখ্যাটি লিখবেন তা বিচার্য নয়।

জাভা মত :

public int function(int args){...}

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


1
def f(x) -> 123:
    return x

আমার সংক্ষিপ্তসার:

  1. কেবলমাত্র ->বিকাশকারীদের ফাংশনের রিটার্নের ধরণ নির্দিষ্ট করে দেওয়ার জন্য প্রবর্তিত। দেখুন পাইথন এনহান্সমেন্ট প্রস্তাবনা 3107

  2. পাইথনটি ব্যাপকভাবে গৃহীত হওয়ার ফলে ভবিষ্যতে কীভাবে জিনিসগুলি বিকশিত হতে পারে তার একটি ইঙ্গিত - দৃ strong় টাইপিংয়ের দিকে ইঙ্গিত - এটি আমার ব্যক্তিগত পর্যবেক্ষণ।

  3. আপনি আর্গুমেন্টের জন্য প্রকারগুলিও নির্দিষ্ট করতে পারেন। ফাংশন এবং আর্গুমেন্টগুলির রিটার্নের ধরণ নির্দিষ্ট করে লজিকাল ত্রুটিগুলি হ্রাস করতে এবং কোড বর্ধিতকরণে সহায়তা করবে।

  4. আপনার রিটার্ন টাইপের হিসাবে এক্সপ্রেশন থাকতে পারে (ফাংশন এবং প্যারামিটার স্তরের উভয়ের জন্য) এবং এক্সপ্রেশনগুলির ফলাফলটি টীকাগুলি অবজেক্টের 'রিটার্ন' বৈশিষ্ট্যের মাধ্যমে অ্যাক্সেস করা যায়। ল্যাম্বদা ইনলাইন ফাংশনগুলির জন্য এক্সপ্রেশন / রিটার্ন মানের জন্য টীকাগুলি খালি থাকবে।


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