2010-01-03 25 views
250

क्या कोई पैरामीटर में पाइथन टूपल का विस्तार करने का कोई तरीका है - वास्तविक पैरामीटर के रूप में?तर्कों में tuples का विस्तार

उदाहरण के लिए, यहाँ expand() जादू करता है:

tuple = (1, "foo", "bar") 

def myfun(number, str1, str2): 
    return (number * 2, str1 + str2, str2 + str1) 

myfun(expand(tuple)) # (2, "foobar", "barfoo") 

मैं जानता हूँ कि एक myfun((a, b, c)) रूप myfun निर्धारित कर सकते हैं, लेकिन निश्चित रूप से वहाँ विरासत कोड हो सकता है। धन्यवाद

उत्तर

486

myfun(*tuple)बिल्कुल आप क्या का अनुरोध करता है।

साइड मुद्दा: के रूप में अपने पहचानकर्ता प्रकार के नाम builtin उपयोग नहीं करना जैसे tuple, list, file, set, और इसके आगे - यह भयानक अभ्यास है और यह वापस आने और आपको काट जब आप कम से कम होगा इसकी उम्मीद है, तो सक्रिय रूप से से बचने के लिए अपने स्वयं के पहचानकर्ताओं के साथ अंतर्निहित नामों से छुटकारा पाएं।

+1

क्या आप कृपया एक स्पष्टीकरण प्रदान कर सकते हैं कि एस्टेरिक्स ऑपरेटर क्या मांगता है? – winklerrr

+1

* ऑपरेटर बस टुपल को अनपैक करता है और उन्हें फ़ंक्शन के लिए स्थितित्मक तर्क के रूप में पास करता है। यहां और देखें: https://docs.python.org/3/tutorial/controlflow.html#tut-unpacking-arguments –

+0

ध्यान दें कि सूचियों के साथ-साथ टुपल्स के लिए एक ही वाक्यविन्यास का उपयोग किया जा सकता है। –

12

the Python tutorial अनुभाग 4.7.3 और 4.7.4 पर एक नज़र डालें। यह तर्क के रूप में tuples गुजरने के बारे में बात करता है।

मैं टुपल का उपयोग करने और अनुक्रम को पार करने के बजाय नामित पैरामीटर (और एक शब्दकोश पास करने) का उपयोग करने पर भी विचार करता हूं। जब स्थिति अंतर्ज्ञानी नहीं होती है या कई पैरामीटर होते हैं तो मुझे स्थितित्मक तर्कों का उपयोग खराब अभ्यास के रूप में मिलता है।

27

ध्यान दें कि आप भी तर्क सूची का हिस्सा विस्तार कर सकते हैं:

myfun(1, *("foo", "bar")) 
+11

ऐसा प्रतीत होता है कि आप केवल तभी ऐसा कर सकते हैं जब विस्तारित ट्यूपल सामान्य रूप से प्रदान किए गए तर्कों के बाद होता है - जब मैं ऐसा करता हूं तो दुभाषिया इसे पसंद नहीं करता है: 'some_func (* tuple_of_stuff, another_argument) ' – Quackmatic

+3

@Quackmatic किसी भी में विस्तारित टुपल रखना स्थान पाइथन 3.5.1 – River

2

यह कार्यात्मक प्रोग्रामिंग तरीका है। यह वाक्य रचना चीनी से बाहर टपल विस्तार सुविधा लिफ्टों:

apply_tuple = lambda f, t: f(*t)

उदाहरण उपयोग:

from toolz import * 
from operator import add, eq 

apply_tuple = curry(apply_tuple) 

thread_last(
    [(1,2), (3,4)], 
    (map, apply_tuple(add)), 
    list, 
    (eq, [3, 7]) 
) 
# Prints 'True' 

curryapply_tuple की redefiniton लंबे समय में partial कॉल का एक बहुत बचाता है।

+1

में ठीक काम करता प्रतीत होता है यह शुरुआत के लिए सहायक नहीं है। यह तीसरे पक्ष के मॉड्यूल का उपयोग करता है और अन्य भ्रमित सामान करता है ... – gberger

+0

gberger, 'lambda f, t: f (* t)' तीसरे पक्ष के मॉड्यूल का उपयोग नहीं करता है और मैं पाइथन शुरुआत करने वाला हूं और यह मेरे लिए सहायक है। यह एक शुद्ध कार्यात्मक दृष्टिकोण है। यदि आप इस शैली का उपयोग नहीं करते हैं तो यह जवाब आपके लिए नहीं है। –

+0

टूलज़ तीसरे पक्ष है, मेरा मतलब है – gberger

0

मैं इसी तरह की समस्या से भाग गया और यह फ़ंक्शन बनाया जो निश्चित फ़ंक्शन का विस्तार करता है। उम्मीद है की यह मदद करेगा।

def run_argtup(func, argvalues): 
    """ 
    Execute any functions with their arguments in tuple. 

    :param func: 
    :param argvalues: 
    :return: 
    """ 
    argnames = get_func_argnames(func) 
    if len(argnames) != len(argvalues): 
     raise ValueError("Length of args doens't match.") 
    for argn, argv in zip(argnames, argvalues): 
     exec('{}=argv'.format(argn)) 
    return eval('func(%s, %s)' % argnames) 
संबंधित मुद्दे