[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.가져온 모듈은 변수 일 뿐이며 이름은 일부 값에 바인딩됩니다. 필요한 것은 모두 가져 와서 글로벌 키워드로 글로벌하게 만드는 것입니다.
가져온 모듈은 변수 일 뿐이며 이름은 일부 값에 바인딩됩니다. 필요한 것은 모두 가져 와서 글로벌 키워드로 글로벌하게 만드는 것입니다.
예:
>>> 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.다음과 같은 함수 내에서 전역 변수를 가져올 수 있습니다.
다음과 같은 함수 내에서 전역 변수를 가져올 수 있습니다.
def my_imports(module_name): globals()[module_name] = __import__(module_name)
-
==============================
3.이 함수는 가져 오려는 모듈의 이름을 반환 할 수 있습니다.
이 함수는 가져 오려는 모듈의 이름을 반환 할 수 있습니다.
mod == __import__(module_name)
-
==============================
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.나는 @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.나는 지금 막 유사한 문제가 있었다, 나의 해결책은 여기있다 :
나는 지금 막 유사한 문제가 있었다, 나의 해결책은 여기있다 :
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.나는 @ 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__)
from https://stackoverflow.com/questions/11990556/how-to-make-global-imports-from-a-function by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] ElementTree 요소에서 줄 번호를 가져 오는 방법이 있나요? (0) | 2018.11.24 |
---|---|
[PYTHON] 파이썬 컬렉션. 카운터 : most_common complexity (0) | 2018.11.24 |
[PYTHON] 다른 파이썬 스크립트 파일 내부의 인자로 파이썬 스크립트 파일을 실행하는 법 (0) | 2018.11.24 |
[PYTHON] 문자열에서 유형으로 어휘 캐스팅 (0) | 2018.11.24 |
[PYTHON] 관리 사이트 : TemplateDoesNotExist at / admin / (0) | 2018.11.24 |