首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python-当分配给sys.modules时检查模块名是否有效

Python-当分配给sys.modules时检查模块名是否有效
EN

Stack Overflow用户
提问于 2018-09-01 00:15:20
回答 1查看 278关注 0票数 1

当在sys.modules中设置项时,一些令人惊讶的值可以用作键:

代码语言:javascript
代码运行次数:0
运行
复制
$ python
>>> import sys
>>> sys.modules["27"] = 123
>>> sys.modules["27"]
123
>>> sys.modules[True] = 123
>>> sys.modules[(1, 7)] = 123

事实上,typesys.modules标识为标准字典.我觉得很令人惊讶。

Python2

代码语言:javascript
代码运行次数:0
运行
复制
>>> type(sys.modules)
<type 'dict'>

Python3 (类型/类统一后)

代码语言:javascript
代码运行次数:0
运行
复制
>>> type(sys.modules)
<class 'dict'>

然而,这些“模块”现在完全无法使用普通的import机制访问。

在Python标准库中是否有一个函数可以用来识别"good“模块名称/点分离模块”path“,我想使用import语法来找出哪些东西是重要的,并且通常遵循该语言的惯例。理想情况下,我希望它是标准库的一部分(如果存在的话),以便跟踪Python本身的更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-01 00:25:12

从技术上讲,要使sys.modules中的某些内容“重要”,所需的只是一个字符串,据我所知

代码语言:javascript
代码运行次数:0
运行
复制
>>> sys.modules['where is your god now?'] = 42
>>> __import__('where is your god now?')
42

这一限制是由__import__内置的:

代码语言:javascript
代码运行次数:0
运行
复制
>>> __import__(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __import__() argument 1 must be str, not int

甚至是unicode!

代码语言:javascript
代码运行次数:0
运行
复制
>>> sys.modules['☃'] = 'looking like christmas?'
>>> __import__('☃')
'looking like christmas?'

尽管要使用import语句,需要有一个东西作为标识符:

代码语言:javascript
代码运行次数:0
运行
复制
>>> sys.modules['josé'] = ':wave:'
>>> import josé
>>> josé
':wave:'

在python3中,您可以使用字符串上的isidentifier方法检查某些东西是否是标识符(对于python2,它遵循[a-zA-Z_][a-zA-Z0-9_]* (我相信)):

代码语言:javascript
代码运行次数:0
运行
复制
>>> 'foo'.isidentifier()
True
>>> 'josé'.isidentifier()
True
>>> '☃'.isidentifier()
False
>>> 'hello world'.isidentifier()
False

如果您想处理虚名:

代码语言:javascript
代码运行次数:0
运行
复制
def dotted_name_is_identifier(x):
    return all(s and s.isidentifier() for s in x.split('.'))

用法:

代码语言:javascript
代码运行次数:0
运行
复制
>>> dotted_name_is_identifier('foo.bar')
True
>>> dotted_name_is_identifier('hello.josé')
True
>>> dotted_name_is_identifier('hello. world')
False
>>> dotted_name_is_identifier('hello..world')
False
>>> dotted_name_is_identifier('hello.world.')
False
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52123886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档