对于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如何查找其模块和方法的好奇。
答案 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
。