복붙노트

[PYTHON] 함수에서 전역 가져 오기를 만드는 방법은 무엇입니까?

PYTHON

함수에서 전역 가져 오기를 만드는 방법은 무엇입니까?

나는 이것이 문제에 접근하는 지저분한 방법이라는 것을 두려워하지만 ...

파이썬에서 일부 조건을 기반으로 일부 가져 오기를 만들고 싶다고 가정 해 봅시다.

이런 이유로 나는 함수를 작성하고 싶다.

def conditional_import_modules(test):
    if test == 'foo':
        import onemodule, anothermodule
    elif test == 'bar':
        import thirdmodule, and_another_module
    else:
        import all_the_other_modules

이제 어떻게 가져온 모듈을 전 세계적으로 사용할 수 있습니까?

예 :

conditional_import_modules(test='bar')
thirdmodule.myfunction()

해결법

  1. ==============================

    1.가져온 모듈은 변수 일 뿐이며 이름은 일부 값에 바인딩됩니다. 필요한 것은 모두 가져 와서 글로벌 키워드로 글로벌하게 만드는 것입니다.

    가져온 모듈은 변수 일 뿐이며 이름은 일부 값에 바인딩됩니다. 필요한 것은 모두 가져 와서 글로벌 키워드로 글로벌하게 만드는 것입니다.

    예:

    >>> math
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'math' is not defined
    >>> def f():
    ...     global math
    ...     import math
    ...
    >>> f()
    >>> math
    <module 'math' from '/usr/local/lib/python2.6/lib-dynload/math.so'>
    
  2. ==============================

    2.다음과 같은 함수 내에서 전역 변수를 가져올 수 있습니다.

    다음과 같은 함수 내에서 전역 변수를 가져올 수 있습니다.

    def my_imports(module_name):
        globals()[module_name] = __import__(module_name)
    
  3. ==============================

    3.이 함수는 가져 오려는 모듈의 이름을 반환 할 수 있습니다.

    이 함수는 가져 오려는 모듈의 이름을 반환 할 수 있습니다.

    mod == __import__(module_name)
    
  4. ==============================

    4.__import__ 내장 함수를 사용하여 전역 범위의 모듈을 조건부로 가져올 수 있습니다.

    __import__ 내장 함수를 사용하여 전역 범위의 모듈을 조건부로 가져올 수 있습니다.

    최상위 모듈을 가져 오려면 (import foo) :

    def cond_import():
      global foo
      foo = __import__('foo', globals(), locals()) 
    

    계층 구조에서 가져 오기 (think : import foo.bar) :

    def cond_import():
      global foo
      foo = __import__('foo.bar', globals(), locals()) 
    

    계층 및 별칭에서 가져 오기 (think : bar로 foo.bar 가져 오기) :

    def cond_import():
      global bar
      foo = __import__('foo.bar', globals(), locals()) 
      bar = foo.bar
    
  5. ==============================

    5.나는 @badzil 방식을 좋아한다.

    나는 @badzil 방식을 좋아한다.

    def global_imports(modulename,shortname = None, asfunction = False):
        if shortname is None: 
            shortname = modulename
        if asfunction is False:
            globals()[shortname] = __import__(modulename)
        else:        
            globals()[shortname] = eval(modulename + "." + shortname)
    

    전통적으로 클래스 모듈에있는 것이 있습니다.

    import numpy as np
    
    import rpy2
    import rpy2.robjects as robjects
    import rpy2.robjects.packages as rpackages
    from rpy2.robjects.packages import importr
    

    전역 범위로 변환 할 수 있습니다.

    global_imports("numpy","np")
    
    global_imports("rpy2")
    global_imports("rpy2.robjects","robjects")
    global_imports("rpy2.robjects.packages","rpackages")
    global_imports("rpy2.robjects.packages","importr",True)
    

    몇 가지 버그가있을 수 있으며이를 확인하고 업데이트 할 것입니다. 마지막 예제는 또 다른 "짧은 이름"또는 "importr | aliasimportr"과 같은 해킹이 될 별칭을 가질 수 있습니다.

  6. ==============================

    6.나는 지금 막 유사한 문제가 있었다, 나의 해결책은 여기있다 :

    나는 지금 막 유사한 문제가 있었다, 나의 해결책은 여기있다 :

    class GlobalImport:
    
        def __enter__(self):
            return self
    
        def __call__(self):
            import inspect
            self.collector = inspect.getargvalues(inspect.getouterframes(inspect.currentframe())[1].frame).locals
    
        def __exit__(self, *args):
            globals().update(self.collector)
    

    그런 다음 코드의 아무 곳이나 :

    with GlobalImport() as gi:
        import os, signal, atexit, threading, _thread
        # whatever you want it won't remain local
        # if only 
        gi()
        # is called before the end of this block
    
    # there you go: use os, signal, ... from whatever place of the module
    
  7. ==============================

    7.나는 @ rafał grabie 접근법을 좋아한다. 심지어 모든 것을 가져 오는 것을 지원하기 때문에. 즉 os import에서 가져온 것 *

    나는 @ rafał grabie 접근법을 좋아한다. 심지어 모든 것을 가져 오는 것을 지원하기 때문에. 즉 os import에서 가져온 것 *

    (나쁜 연습 인 XD 임에도 불구하고)

    주석을 달 수는 없지만 여기 python 2.7 버전이 있습니다.

    또한 마지막에 함수를 호출 할 필요가 없습니다.

    class GlobalImport:
        def __enter__(self):
            return self
        def __exit__(self, *args):
            import inspect
            collector = inspect.getargvalues(inspect.getouterframes(inspect.currentframe())[1][0]).locals
            globals().update(collector)
    
    def test():
        with GlobalImport() as gi:
            ## will fire a warning as its bad practice for python. 
            from os import *
    
    test()
    print path.exists(__file__)
    
  8. from https://stackoverflow.com/questions/11990556/how-to-make-global-imports-from-a-function by cc-by-sa and MIT license