代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

python-在分配给时检查模块名是否有效系统模块

  •  1
  • Greg Nisbet  · 技术社区  · 6 年前

    sys.modules ,一些令人惊讶的值将可用作键:

    $ python
    >>> import sys
    >>> sys.modules["27"] = 123
    >>> sys.modules["27"]
    123
    >>> sys.modules[True] = 123
    >>> sys.modules[(1, 7)] = 123
    

    事实上, type 作为标准词典。。。我觉得很奇怪。

    蟒蛇2

    >>> type(sys.modules)
    <type 'dict'>
    

    Python3(类型/类统一后)

    >>> type(sys.modules)
    <class 'dict'>
    

    import 机制。

    Python标准库中是否有一个函数可以用来识别“好的”模块名/dot分隔模块“路径” 通常遵循语言的惯例。理想情况下,我希望标准库的一部分(如果存在的话)能够跟踪Python本身的变化。

    1 回复  |  直到 6 年前
        1
  •  2
  •   anthony sottile    6 年前

    技术上 所有的一切都是为了 sys.modules 就我所知,“可导入”就是一个字符串

    >>> sys.modules['where is your god now?'] = 42
    >>> __import__('where is your god now?')
    42
    

    该限制是由 __import__ 内置:

    >>> __import__(42)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: __import__() argument 1 must be str, not int
    

    >>> sys.modules['☃'] = 'looking like christmas?'
    >>> __import__('☃')
    'looking like christmas?'
    

    尽管使用 import 你需要一个东西作为标识符:

    >>> sys.modules['josé'] = ':wave:'
    >>> import josé
    >>> josé
    ':wave:'
    

    isidentifier 方法(对于python2,如下所示 [a-zA-Z_][a-zA-Z0-9_]* 我相信):

    >>> 'foo'.isidentifier()
    True
    >>> 'josé'.isidentifier()
    True
    >>> '☃'.isidentifier()
    False
    >>> 'hello world'.isidentifier()
    False
    

    如果要处理虚线名称:

    def dotted_name_is_identifier(x):
        return all(s and s.isidentifier() for s in x.split('.'))
    

    >>> 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