Can I use __init__.py to define global variables?

后端 未结 4 2002
一生所求
一生所求 2020-11-29 17:24

I want to define a constant that should be available in all of the submodules of a package. I\'ve thought that the best place would be in in the __init__.py fil

相关标签:
4条回答
  • 2020-11-29 18:05

    You can define global variables from anywhere, but it is a really bad idea. import the __builtin__ module and modify or add attributes to this modules, and suddenly you have new builtin constants or functions. In fact, when my application installs gettext, I get the _() function in all my modules, without importing anything. So this is possible, but of course only for Application-type projects, not for reusable packages or modules.

    And I guess no one would recommend this practice anyway. What's wrong with a namespace? Said application has the version module, so that I have "global" variables available like version.VERSION, version.PACKAGE_NAME etc.

    0 讨论(0)
  • 2020-11-29 18:10

    Just wanted to add that constants can be employed using a config.ini file and parsed in the script using the configparser library. This way you could have constants for multiple circumstances. For instance if you had parameter constants for two separate url requests just label them like so:

    mymodule/config.ini
    [request0]
    conn = 'admin@localhost'
    pass = 'admin'
    ...
    
    [request1]
    conn = 'barney@localhost'
    pass = 'dinosaur'
    ...
    

    I found the documentation on the Python website very helpful. I am not sure if there are any differences between Python 2 and 3 so here are the links to both:

    For Python 3: https://docs.python.org/3/library/configparser.html#module-configparser

    For Python 2: https://docs.python.org/2/library/configparser.html#module-configparser

    0 讨论(0)
  • 2020-11-29 18:13

    You cannot do that. You will have to explicitely import your constants into each individual module's namespace. The best way to achieve this is to define your constants in a "config" module and import it everywhere you require it:

    # mypackage/config.py
    MY_CONST = 17
    
    # mypackage/main.py
    from mypackage.config import *
    
    0 讨论(0)
  • 2020-11-29 18:14

    You should be able to put them in __init__.py. This is done all the time.

    mypackage/__init__.py:

    MY_CONSTANT = 42
    

    mypackage/mymodule.py:

    from mypackage import MY_CONSTANT
    print "my constant is", MY_CONSTANT
    

    Then, import mymodule:

    >>> from mypackage import mymodule
    my constant is 42
    

    Still, if you do have constants, it would be reasonable (best practices, probably) to put them in a separate module (constants.py, config.py, ...) and then if you want them in the package namespace, import them.

    mypackage/__init__.py:

    from mypackage.constants import *
    

    Still, this doesn't automatically include the constants in the namespaces of the package modules. Each of the modules in the package will still have to import constants explicitly either from mypackage or from mypackage.constants.

    0 讨论(0)
提交回复
热议问题