আমি কীভাবে আমার টাইপ ইঙ্গিতগুলিতে ফাংশন প্রকারটি নির্দিষ্ট করতে পারি?


137

আমি আমার বর্তমান পাইথন 3.5 প্রকল্পে প্রকারের ইঙ্গিতগুলি ব্যবহার করতে চাই। আমার ফাংশনটি প্যারামিটার হিসাবে একটি ফাংশন গ্রহণ করা উচিত।

আমি কীভাবে আমার টাইপ ইঙ্গিতগুলিতে টাইপ ফাংশন নির্দিষ্ট করতে পারি?

import typing

def my_function(name:typing.AnyStr, func: typing.Function) -> None:
    # However, typing.Function does not exist.
    # How can I specify the type function for the parameter `func`?

    # do some processing
    pass

আমি পিইপি 483 চেক করেছি , তবে সেখানে কোনও ফাংশনের ধরণের ইঙ্গিত খুঁজে পাইনি।


21
একটি ফাংশনটি হ'লCallable
জোনারশপে

উত্তর:


174

@ জোনারশপে যেমন একটি মন্তব্যে উল্লেখ করেছেন, এটি দিয়ে এটি করা যেতে পারে typing.Callable:

from typing import AnyStr, Callable

def my_function(name: AnyStr, func: Callable) -> None:

ইস্যুটি Callableএর নিজস্ব অর্থ অনুবাদ করা হয় Callable[..., Any]যার অর্থ:

কলযোগ্য যেকোন সংখ্যক / ধরণের আর্গুমেন্ট নেয় এবং যে কোনও ধরণের মান প্রদান করে। বেশিরভাগ ক্ষেত্রেই, আপনি যা চান তা এটি নয় কারণ আপনি কোনও ক্রিয়াকলাপটি পাস করার অনুমতি দিন। আপনি চান যে ফাংশন প্যারামিটার এবং রিটার্ন টাইপগুলি খুব ইঙ্গিত করা হয়।

তাই অনেকেরই typesমধ্যে typingসমর্থন উপ-স্ক্রিপ্টিং যা এই অতিরিক্ত ধরনের উল্লেখ করে করতে ওভারলোড করা হয়েছে। সুতরাং, উদাহরণস্বরূপ, যদি আপনার এমন একটি ফাংশন থাকে sumযা দুটি সময় নেয় intএবং একটি ফেরত দেয় int:

def sum(a: int, b: int) -> int: return a+b

এটির জন্য আপনার টিকাটি হবে:

Callable[[int, int], int]

অর্থাৎ প্যারামিটারগুলি বাইরের সাবস্ক্রিপশনে বাইরের সাবস্ক্রিপ্টে দ্বিতীয় উপাদান হিসাবে রিটার্ন টাইপের সাথে সাব-স্ক্রিপ্ট করা হয়। সাধারণভাবে:

Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]

26
এই typingস্টাফ পুরো অজগর ভাষা একটি খাঁজ আপ সরানো।
জাভাদবা

1
@javadba - উহু, হ্যাঁ, কিন্তু আমি এখনও নিশ্চিত না যা ডায়াল উপর আছি ... যাইহোক - প্রায় কি Callable[[Arg, Types, Here], ...]জন্য *args, **kwargs, অভিব্যক্তি শুধুমাত্র args এবং অবস্থানগত শুধুমাত্র args? তারা কি কল করার জন্য স্বাক্ষর প্রকারের কনভেনশন কল করার কথা ভেবে দেখেনি? ;)
টমাসজ গ্যান্ডার

10

আরেকটি আকর্ষণীয় বিষয় লক্ষণীয় হ'ল আপনি বিল্ট ইন ফাংশনটি type()কোনও ফর্ম-ইন বিল্ট টাইপ পেতে এবং এটি ব্যবহার করতে পারেন। সুতরাং আপনি থাকতে পারে

def f(my_function: type(abs)) -> int:
    return my_function(100)

বা যে ফর্ম কিছু


একটি টাইপ ইঙ্গিতটি আপনি যা চান তা হতে পারে তবে সেগুলি সর্বদা অলসভাবে মূল্যায়ন করা হয় নি। এছাড়াও, আপনার কাজটি কি কেবলমাত্র গ্রহণ builtin_function_or_methodকরে my_function? lambdaকাজ হবে না ? একটি ব্যবহারকারী নির্ধারিত ফাংশন বা আবদ্ধ পদ্ধতি?
টমাসজ গ্যান্ডার 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.