Python查找模块和方法的方式

时间:2019-03-21 11:30:08

标签: python python-3.x

对于linux安装环境,Python标准模块主要作为单个.py文件存储在路径“ / usr / lib64 / python3x / ”中。 (我在这里使用的是3.6版和Centos 6版)所有可用的方法和类都应该在单个.py文件中找到。

以模块“ datetime ”为例,在文档中它说它有一个名为“ date ”的类,而对于该类,它有一个名为“ today()”。因此,在“ /usr/lib64/python3.6/datetime.py ”中,我们可以找到

output$XX<-renderDataTable(input$ABC)

但是,对于模块“ ssl”,在{<3>}的“ /usr/lib64/python3.6/ssl.py ”中,有一种称为“ > SSLContext.cert_store_stats()”,但是在文件“ ssl.py”中,我可以找到类 SSLContext ,但是我似乎找不到方法 cert_store_stats ()。为什么会这样?

这并非针对任何代码问题,只是出于对Python如何查找其模块和方法的好奇。

2 个答案:

答案 0 :(得分:1)

如果您阅读ssl.py源代码,则第一行会指出:

# Wrapper module for _ssl, providing some additional facilities
# implemented in Python.

再往下一点(在模块的文档字符串之后),您会找到

from _ssl import _SSLContext

最后是SSLContext类定义,其开头为:

class SSLContext(_SSLContext):

IOW,您要查找的方法是从_ssl._SSLContext继承的。

NB:_ssl是一个C编码模块,您会在stdlib和3rd part应用中找到另外几个。

答案 1 :(得分:0)

@DanielRoseman在评论中指出,SLLContext inherits from _SLLContext in ssl.ply

class SSLContext(_SSLContext):

_SLLContext位于_ssl.c中。如果环顾四周,您会看到in _ssl.c _SSLContext.cert_store_stats is defined

static PyObject *
_ssl__SSLContext_cert_store_stats_impl(PySSLContext *self)
/*[clinic end generated code: output=5f356f4d9cca874d input=eb40dd0f6d0e40cf]*/
{
    X509_STORE *store;
    STACK_OF(X509_OBJECT) *objs;
    X509_OBJECT *obj;
    int x509 = 0, crl = 0, ca = 0, i;

    store = SSL_CTX_get_cert_store(self->ctx);
    objs = X509_STORE_get0_objects(store);
    for (i = 0; i < sk_X509_OBJECT_num(objs); i++) {
        obj = sk_X509_OBJECT_value(objs, i);
        switch (X509_OBJECT_get_type(obj)) {
            case X509_LU_X509:
                x509++;
                if (X509_check_ca(X509_OBJECT_get0_X509(obj))) {
                    ca++;
                }
                break;
            case X509_LU_CRL:
                crl++;
                break;
            default:
                /* Ignore X509_LU_FAIL, X509_LU_RETRY, X509_LU_PKEY.
                 * As far as I can tell they are internal states and never
                 * stored in a cert store */
                break;
        }
    }
    return Py_BuildValue("{sisisi}", "x509", x509, "crl", crl,
        "x509_ca", ca);
}

由于SSLContext的{​​{1}}继承,_SSLContext可以访问方法SLLContext