2014-05-14 18 views
17

में प्रारूप() विधि के साथ सही/गलत है, मैं बूलियन अभिव्यक्तियों के लिए एक सत्य तालिका मुद्रित करने का प्रयास कर रहा था। जबकि यह कर रहा है, मैं निम्नलिखित पर ठोकर खाई:प्रिंटिंग बूलियन मान पायथन

>>> format(True, "") # shows True in a string representation, same as str(True) 
'True' 
>>> format(True, "^") # centers True in the middle of the output string 
'1' 

जैसे ही मैंने एक फॉर्मेट स्पेसिफायर निर्दिष्ट करते हैं, format()1 करने के लिए True बदल देता है। मुझे पता है कि boolint का एक उपवर्ग है, ताकि True1 का मूल्यांकन:

>>> format(True, "d") # shows True in a decimal format 
'1' 

लेकिन पहले उदाहरण में 1 को फॉर्मेट स्पेसिफायर परिवर्तन 'True' का उपयोग कर रहा है?

मैं docs for clarification पर बदल गया। केवल एक चीज है यह कहते हैं:

एक सामान्य परंपरा है कि एक खाली प्रारूप स्ट्रिंग ("") एक ही परिणाम के रूप में यदि आप मूल्य पर str() बुलाया था उत्पादन होता है। एक गैर-खाली प्रारूप स्ट्रिंग आमतौर पर परिणाम को संशोधित करती है।

तो जब आप प्रारूप विनिर्देशक का उपयोग करते हैं तो स्ट्रिंग को संशोधित किया जाता है। लेकिन True से 1 में परिवर्तन क्यों केवल एक संरेखण ऑपरेटर (उदा। ^) निर्दिष्ट है?

+1

"एक सामान्य सम्मेलन यह है कि एक खाली प्रारूप स्ट्रिंग (" ") उसी परिणाम का उत्पादन करती है जैसे आपने मूल्य पर str() कहा था। एक गैर-खाली प्रारूप स्ट्रिंग आम तौर पर परिणाम को संशोधित करती है।" - [डॉक्स] (https://docs.python.org/2/library/string.html#format- स्पेसिफिकेशन-mini-language) – netcoder

+0

मुझे नहीं पता कि ऐसा क्यों किया जाता है, लेकिन यदि आप ठीक करना चाहते हैं यह आप 'प्रारूप (स्ट्र (ट्रू), "^" कर सकते हैं) ' – jspurim

+0

धन्यवाद, मैंने इसे पहले ही तय कर दिया है, लेकिन मैं सिर्फ" क्यों "के लिए उत्सुक था :) –

उत्तर

9

उत्कृष्ट सवाल! मेरा मानना ​​है कि मेरे पास जवाब है। इसके लिए सी में पायथन स्रोत कोड के माध्यम से खुदाई की आवश्यकता है, इसलिए मेरे साथ भालू।

पहला, format(obj, format_spec)obj.__format__(format_spec) के लिए सिंटैक्टिक चीनी है। विशेष रूप से जहां यह तब होता है के लिए, आप abstract.c में देखने के लिए, समारोह में होगा:

PyObject * 
PyObject_Format(PyObject* obj, PyObject *format_spec) 
{ 
    PyObject *empty = NULL; 
    PyObject *result = NULL; 

    ... 

    if (PyInstance_Check(obj)) { 
     /* We're an instance of a classic class */ 
HERE -> PyObject *bound_method = PyObject_GetAttrString(obj, "__format__"); 
     if (bound_method != NULL) { 
      result = PyObject_CallFunctionObjArgs(bound_method, 
                format_spec, 
                NULL); 

    ... 
} 

सटीक कॉल के लिए, हम intobject.c में देखने के लिए है:

static PyObject * 
int__format__(PyObject *self, PyObject *args) 
{ 
    PyObject *format_spec; 

    ... 

    return _PyInt_FormatAdvanced(self, 
        ^   PyBytes_AS_STRING(format_spec), 
        |   PyBytes_GET_SIZE(format_spec)); 
       LET'S FIND THIS 
    ... 
} 

_PyInt_FormatAdvanced है

static PyObject* 
format_int_or_long(PyObject* obj, 
       STRINGLIB_CHAR *format_spec, 
      Py_ssize_t format_spec_len, 
      IntOrLongToString tostring) 
{ 
    PyObject *result = NULL; 
    PyObject *tmp = NULL; 
    InternalFormatSpec format; 

    /* check for the special case of zero length format spec, make 
     it equivalent to str(obj) */ 
    if (format_spec_len == 0) { 
     result = STRINGLIB_TOSTR(obj); <- EXPLICIT CAST ALERT! 
     goto done; 
    } 

    ... // Otherwise, format the object as if it were an integer 
} 
: वास्तव में एक समारोह formatter.h में पाया के रूप में formatter_string.c में किसी मैक्रो के रूप में परिभाषित 10

और इसमें आपका जवाब है। format_spec_len0 है, और यदि यह है, तो obj को एक स्ट्रिंग में कनवर्ट करें। जैसा कि आप जानते हैं, str(True)'True' है, और रहस्य खत्म हो गया है!

+2

मुझे लगता है कि ओपी पूछ रहा है कि '' '^' प्रारूप (सही) == '1''', क्यों नहीं' '''।प्रारूप (सही) == 'सही'''। या फिर पूर्व के लिए 'int'' के लिए एक अंतर्निहित कलाकार क्यों होगा जब बाद वाला सही ढंग से मूल्यांकन करेगा। – aruisdante

+0

'ट्रू' * * एक 'int' है, और यह केवल' int 'से बाहर निकला है और' format_spec' खाली होने पर 'str' में डाला गया है। – huu

+1

पायथन में नहीं है यह नहीं है। '>>> टाइप करें (सही) = ' ', और' 'टाइप (सही) == प्रकार (1) == झूठा''। सी दुभाषिया में अंतर्निहित सी कोड में यह स्पष्ट रूप से ''int'' में परिवर्तित हो जाता है क्योंकि सी में बूल आदिम की कमी होती है, लेकिन यह अजगर पक्ष पर अंतर्निहित रूपांतरण की व्याख्या नहीं करेगी। – aruisdante

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