मुझे कुछ पायथन 3 कोड को पायथन 2 कोड में बदलने की आवश्यकता है

from collections.abc import Sequence

def to_tensor(X, device):
  .....
    if isinstance(X, (list, tuple)):
        return [to_tensor_(x) for x in X]

    if isinstance(X,Sequence):<-------equals to if isinstance(X,(str,bytes))?
        X = torch.tensor(np.array(X))

    return X.to(device)

जैसा कि आप ऊपर देख सकते हैं, मैं जानना चाहता हूं कि:

isinstance(X,Sequence)

बराबर है

isinstance(X,(str,bytes))

और दस्तावेज़ीकरण मुझे कोई मतलब नहीं है।

1
Alex Luya 3 जुलाई 2018, 12:38

1 उत्तर

सबसे बढ़िया उत्तर

संक्षिप्त उत्तर: नहीं, यह समकक्ष नहीं है।

सबसे लंबा उत्तर:

सबसे पहले, Python2 का कोई "बाइट्स" प्रकार नहीं है - Python3 bytes Python2 str हैं और Python3 str Python2 unicode हैं, इसलिए सही प्रश्न होगा: isinstance(X,Sequence) isinstance(X, (unicode, str)) के बराबर।

फिर, उत्तर अभी भी है नहीं। Py3 str और bytes वास्तव में abc.Sequence के उदाहरण हैं, लेकिन इसलिए abc.Sequence को लागू करने वाले किसी वर्ग के उदाहरण हैं, इसलिए आपके पास ऐसी वस्तुएं हो सकती हैं जो Sequence बिना str या bytes ((Django orm का Queryset वर्ग एक आदर्श उम्मीदवार होगा) के बिना हैं।

और यह दस्तावेज़: https://docs.python। org/3/library/collections.abc.html#collections.abc.Sequence मेरे लिए कोई मायने नहीं रखता

अगर आप इस दस्तावेज़ में दिए गए लिंक का अनुसरण करते हैं, तो आपको एक मौखिक परिभाषा मिलती है एक "अनुक्रम" क्या है:

एक पुनरावर्तनीय जो पूर्णांक का उपयोग करके कुशल तत्व पहुंच का समर्थन करता है getitem() विशेष विधि के माध्यम से सूचकांक और एक लेन() को परिभाषित करता है विधि जो अनुक्रम की लंबाई लौटाती है (..) ध्यान दें कि dict getitem() और len() का भी समर्थन करता है, लेकिन इसे अनुक्रम के बजाय मैपिंग माना जाता है

इस परिभाषा के अनुसार, यह जांचने के लिए कि क्या कोई वस्तु एक अनुक्रम है, आपको परीक्षण करना होगा कि क्या यह चलने योग्य है, एक __getitem__ और एक __len_ विधि है और यह dict नहीं है। यह py3 कोड के सटीक समकक्ष नहीं होगा, लेकिन यह जितना करीब आप प्राप्त कर सकते हैं (कम से कम अधिक संदर्भ के बिना, नीचे cf):

def is_sequence(obj):
    if isinstance(obj, dict):
        return False

    if not (
        hasattr(obj, "__getitem__") 
        and hasattr(obj, "__len__")
        ): 
        return False

    # we might have false postive here
    # with dict-likes not inheriting from
    # `dict`, so we also weed out objects 
    # having a `keys()` methods which
    # are most likely dict-likes
    if hasattr(obj, "keys"):
        return False
    return True

अब आपकी समस्या का वास्तविक उत्तर थोड़ा अलग हो सकता है: "अनुक्रम" की औपचारिक परिभाषा (अधिक या कम) है, और वहां संदर्भ है जिसमें आप जिस कोड को पोर्ट कर रहे हैं उसे कहा जाता है और लेखक का इरादा है।

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

या लेखक ने यह मान लिया होगा कि उसका कार्य कभी भी एक स्ट्रिंग या बाइट्स को पारित नहीं करेगा, लेकिन फिर मुझे समझ में नहीं आता कि वह अन्य अनुक्रमों से अलग सूचियों और टुपल्स का इलाज क्यों करेगा।

एक लंबी कहानी को छोटा करने के लिए: आपको संदर्भ का अध्ययन करना होगा, या अंत में लेखक से स्पष्टीकरण मांगना होगा - यदि संभव हो तो, बिल्कुल।

1
bruno desthuilliers 3 जुलाई 2018, 13:49