2012-05-16 15 views
9

मैं सीखने की कोशिश कर रहा हूं कि पायथन के लिए सी-एक्सटेंशन कैसे लिखना है और यह सुनिश्चित करना चाहता हूं कि मैं समझता हूं कि PyArg_ParseTupleAndKeywords कैसे काम करता है।PyArg_ParseTupleAndKeywords कैसे काम करता है?

मेरा मानना ​​है कि पहला तर्क एक पायओब्जेक्ट पॉइंटर है जो सी-एक्सटेंशन फ़ंक्शन में पारित किए गए तर्कों की एक सरणी को इंगित करता है। दूसरा तर्क उन खोजशब्दों की एक सूची है जो पारित किए गए थे, जिन पदों पर उन्हें पारित किया गया था और, संभवतः, कुछ प्रकार के सूचक ध्वज बताते हैं कि कीवर्ड किस स्थिति में शुरू होते हैं और स्थिति अप्रासंगिक हो जाती है।

PyArg_ParseTupleAndKeywords तो एक कीवर्ड और दोनों प्रारूप स्ट्रिंग (3 तर्क) के साथ निर्दिष्ट तर्क और सी चर के पते (5 वीं & + तर्क), जो उचित मान होना चाहिए करने के लिए के बीच मैप करने के लिए अपने (4 तर्क) कीवर्ड की सूची का उपयोग करता है कॉपी किया गया।

क्या मेरी समझ सही है? जब मैं ऑनलाइन दस्तावेज के माध्यम से पढ़ता हूं, तो मैं देखता हूं कि "स्थितित्मक तर्क और कीवर्ड तर्क" के संदर्भ हैं, जो मुझे अंधेरे में थोड़ा सा महसूस करते हैं। पाइथन दुभाषिया के लिए फ़ाइल कहां है जो PyArg_ParseTupleAndKeywords को संभालती है?

उत्तर

6

क्या आपने http://docs.python.org/c-api/arg.html पर उद्घाटन स्पष्टीकरण के माध्यम से पढ़ा है? यह क्या हो रहा है यह बताने का एक बहुत अच्छा काम करता है। PyArg_ParseTupleAndKeywords के विशिष्ट संदर्भ के लिए सही न जाएं; यह मानता है कि आप ऊपर दिए गए पाठ को पढ़ते हैं, और यह स्वयं से बहुत उपयोगी नहीं है।

हालांकि, आपको लगभग यह मिल गया है। पहला तर्क वास्तव में आने वाले स्थितित्मक तर्कों की एक सूची है। दूसरा आने वाले कीवर्ड तर्कों का मानचित्र है (दिए गए मान को दिए गए कीवर्ड नाम का मानचित्रण)। चौथा तर्क वास्तव में उन कीवर्ड की सूची है जो आपका कार्य स्वीकार करने के लिए तैयार हैं। हां, तीसरा तर्क प्रारूप स्ट्रिंग है और 5 वें और बाद में सी पॉइंटर्स हैं जिनमें मूल्यों की प्रतिलिपि बनाई जाती है।

आपको PyArg_ParseTupleAndKeywords()Python/getargs.c के तहत मिलेगा।

+1

सिर्फ सी एपीआई दस्तावेज़, वहाँ http://docs.python.org/2/extending/extending.html – timbo

2

का अनुकरण करने के लिए अजगर में निम्नलिखित:

def keywords(a, b, foo=None, bar=None, baz=None): 
    pass 

निम्नलिखित काम करेगा:

 

static PyObject *keywords(PyObject *self, PyObject *args, PyObject *kwargs) { 
    char *a; 
    char *b; 
    char *foo = NULL; 
    char *bar = NULL; 
    char *baz = NULL; 

    // Note how "a" and "b" are included in this 
    // even though they aren't supposed to be in kwargs like in python 
    static char *kwlist[] = {"a", "b", "foo", "bar", "baz", NULL}; 

    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss|sss", kwlist, &a, &b, &foo, &bar, &baz)) { 
     return NULL; 
    } 

    printf("a is %s\n", a); 
    printf("b is %s\n", b); 
    printf("foo is %s\n", foo); 
    printf("bar is %s\n", bar); 
    printf("baz is %s\n", baz); 

    Py_RETURN_NONE; 
} 
// ... 
static PyMethodDef SpamMethods[] = { 
    //... 
    {"keywords", (PyCFunction) keywords, METH_VARARGS | METH_KEYWORDS, "practice kwargs"}, 
    {NULL, NULL, 0, NULL} 

और यह उपयोग करने के लिए:

 
from spam import keywords 

keywords() // Fails, require a and b 
keywords('a') // fails, requires b 
keywords('a', 'b') 
keywords('a', 'b', foo='foo', bar='bar', baz='baz) 
keywords('a', 'b','foo', 'bar', 'baz') 
keywords(a='a', b='b', foo='foo', bar='bar', baz='baz') 
बजाय
+0

अजीब- मैं संपादित नहीं कर सकता एक अच्छा पठनीय सारांश है। जब आप "कीवर्ड" फ़ंक्शन डालते हैं, तो आप इसे 'पीईसीफंक्शन' के बजाय 'पीईसीफंक्शनक्शनथिड्स' के रूप में डालना चाहते हैं। –

संबंधित मुद्दे