मैं अपने प्रकार के संकेत में फ़ंक्शन प्रकार कैसे निर्दिष्ट कर सकता हूं?


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

मैंने PEP 483 की जाँच की , लेकिन वहाँ एक फ़ंक्शन प्रकार संकेत नहीं मिला।


21
एक फ़ंक्शन हैCallable
जॉन्सर्शपे

3
python.org/dev/peps/pep-0483/#fundamental-building-blocks , "हम जोड़ सकते हैं" से पहले अंतिम बुलेट बिंदु।

जवाबों:


174

जैसा कि @jonrsharpe ने एक टिप्पणी में कहा, यह इस प्रकार किया जा सकता है 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? क्या उन्होंने कॉलवॉल के लिए हस्ताक्षर में कॉल करने के बारे में नहीं सोचा है? ;)
टॉमस गैंडर

10

एक और दिलचस्प बात यह है कि आप बिल्ट इन फंक्शन type()का उपयोग कर सकते हैं ताकि बिल्ट इन फंक्शन को बनाया जा सके और उसका उपयोग किया जा सके। तो आप कर सकते थे

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

या उस रूप का कुछ


एक प्रकार का संकेत हो सकता है जो आप चाहते हैं, लेकिन वे हमेशा आलसी मूल्यांकन नहीं किया गया है। इसके अलावा, क्या आपका कार्य वास्तव में केवल के builtin_function_or_methodरूप में लेता है my_function? एक lambdaकाम नहीं होगा ? उपयोगकर्ता परिभाषित फ़ंक्शन या बाध्य विधि?
टॉमस गैंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.