스크립트에 --verbose 또는 -v 옵션을 구현하는 방법은 무엇입니까?
나는 알고 있습니다--verbose또는-v몇 가지 툴을 사용하여 이를 스크립트와 툴에 구현하고 싶습니다.
저는 다음을 배치할 생각을 했습니다.
if verbose:
print ...
내 소스 코드를 통해, 만약 사용자가 통과한다면.-v 션, 변verbose됩니다.True텍스트가 인쇄됩니다.
이것이 올바른 접근 방식입니까 아니면 더 일반적인 방법이 있습니까?
추가:나는 논쟁의 파싱을 구현하는 방법을 요구하는 것이 아닙니다.내가 어떻게 하는지 안다는 것.나는 특별히 상세한 옵션에만 관심이 있습니다.
제 제안은 기능을 사용하는 것입니다.하지만 그것을 넣는 것보다.if당신이 하고 싶어할 수도 있는 기능에서, 다음과 같이 하십시오.
if verbose:
def verboseprint(*args):
# Print each argument separately so caller doesn't need to
# stuff everything to be printed into a single string
for arg in args:
print arg,
print
else:
verboseprint = lambda *a: None # do-nothing function
예, 다음에서 함수를 정의할 수 있습니다.if조건이 참인 경우에만 정의됩니다!)
여기서 Python 3은 다음과 .print이미 함수입니다(또는 사용할 의향이 있는 경우).print의 2.x함을 사용한 from __future__ import print_function훨씬 더 간단합니다.
verboseprint = print if verbose else lambda *a, **k: None
이는 (하여) 된 경우, 않는 됩니다.verbose 깃발
프로그램을 실행하는 동안 사용자가 상세 모드를 변경할 수 있다면, 이는 잘못된 접근 방식일 것입니다.if함수에서는)을 사용하지만 명령줄 플래그로 설정하기 때문에 한 번만 결정하면 됩니다.
그런 다음 예를 사용합니다.verboseprint("look at all my verbosity!", object(), 3)메시지를 인쇄하려는 경우 언제든지 가능합니다.
Python을 사용할 의사가 있고 사용할 수 있는 경우-O스크립트의 "프로덕션" 버전을 시작할 때 상세도를 켜거나 끌 플래그(또는 설정)PYTHONOPTIMIZE variable이 더 .__debug__자세한 출력을 인쇄할 모든 위치에 플래그를 지정합니다.
if __debug__: print("Verbosity enabled")
하면 이 됩니다. (및 " " " " " " 은 실행됩니다.if문의 본문만 남기고 제거됨).최적화를 사용하여 실행하면 Python은 실제로 이러한 문장을 완전히 삭제합니다.성능에 전혀 영향을 미치지 않습니다!자세한 내용은 및 블로그 게시물을 참조하십시오.
을 합니다.logging모듈:
import logging as log
…
args = p.parse_args()
if args.verbose:
log.basicConfig(format="%(levelname)s: %(message)s", level=log.DEBUG)
log.info("Verbose output.")
else:
log.basicConfig(format="%(levelname)s: %(message)s")
log.info("This should be verbose.")
log.warning("This is a warning.")
log.error("This is an error.")
이 모든 작업은 자동으로 다음으로 이동합니다.stderr:
% python myprogram.py
WARNING: This is a warning.
ERROR: This is an error.
% python myprogram.py -v
INFO: Verbose output.
INFO: This should be verbose.
WARNING: This is a warning.
ERROR: This is an error.
자세한 내용은 Python Docs 및 자습서를 참조하십시오.
@kindall의 답변을 작성하고 단순화하는 방법은 다음과 같습니다.
v_print = None
def main()
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbosity', action="count",
help="increase output verbosity (e.g., -vv is more than -v)")
args = parser.parse_args()
if args.verbosity:
def _v_print(*verb_args):
if verb_args[0] > (3 - args.verbosity):
print verb_args[1]
else:
_v_print = lambda *a: None # do-nothing function
global v_print
v_print = _v_print
if __name__ == '__main__':
main()
그러면 스크립트 전체에서 다음과 같은 용도로 사용할 수 있습니다.
v_print(1, "INFO message")
v_print(2, "WARN message")
v_print(3, "ERROR message")
스크립트는 다음과 같이 호출할 수 있습니다.
% python verbose-tester.py -v
ERROR message
% python verbose=tester.py -vv
WARN message
ERROR message
% python verbose-tester.py -vvv
INFO message
WARN message
ERROR message
몇 가지 참고 사항:
- 첫 번째 인수는 오류 수준이고 두 번째 인수는 메시지입니다.그것은 마법의 번호를 가지고 있습니다.
3로그의 상한선을 설정하지만 단순성에 대한 타협으로 받아들입니다. - 네가 원한다면
v_print당신의 프로그램 전체에서 일하기 위해서, 당신은 전세계와 함께 정크를 해야 합니다.재미는 없지만, 저는 누군가에게 더 나은 방법을 찾으라고 도전합니다.
스크립트에서 수행하는 작업은 런타임에 '자세한 내용' 옵션이 설정되어 있는지 확인한 다음 로깅 수준을 디버그로 설정하는 것입니다.설정되어 있지 않으면 info로 설정합니다.이렇게 하면 코드 전체에 대해 '만약 상세하다면' 검사를 하지 않아도 됩니다.
저는 제 프로젝트를 위해 가상 환경에서 로그 코드를 훔쳤습니다.들여다보기main()virtualenv.py어떻게 초기화되는지 확인할 수 있습니다.코드는 다음과 같이 흩어져 있습니다.logger.notify(),logger.info(),logger.warn()등등. 가 실로제메소로 에 따라 됩니다.-v,-vv,-vvv또는-q.
기능이 있다면 더 깨끗할 수도 있습니다. 예를 들어 호출이라고 합니다.vprint자세한 내용을 확인할 수 있습니다.그럼 당신은 그냥 당신의 것을 불러요.vprint원하는 임의의 장소에서 기능을 수행할 수 있습니다.
@kindall의 솔루션은 내 Python 버전 3.5에서 작동하지 않습니다. @styles는 그의 코멘트에서 그 이유가 추가적인 선택적 키워드 인수 때문이라고 정확하게 명시합니다.따라서 Python 3용으로 약간 개선된 버전은 다음과 같습니다.
if VERBOSE:
def verboseprint(*args, **kwargs):
print(*args, **kwargs)
else:
verboseprint = lambda *a, **k: None # do-nothing function
변수가 수 , 다과같글변있수있다로 설정되어 있을 것입니다."로 될 수 있습니다.argparsesys.argv프로그램이 장황해야 하는지 여부를 나타냅니다.그런 다음 상세도가 켜져 있으면 함수가 실행되는 한 표준 입력이 null 장치로 전환되도록 데코레이터를 작성할 수 있습니다.
import os
from contextlib import redirect_stdout
verbose = False
def louder(f):
def loud_f(*args, **kwargs):
if not verbose:
with open(os.devnull, 'w') as void:
with redirect_stdout(void):
return f(*args, **kwargs)
return f(*args, **kwargs)
return loud_f
@louder
def foo(s):
print(s*3)
foo("bar")
이 대답은 이 코드에서 영감을 받았습니다. 사실, 저는 그것을 제 프로그램의 모듈로 사용하려고 했지만, 이해할 수 없는 오류가 발생해서 일부를 수정했습니다.
과 달리 2진법이라는 입니다.logging이를 통해 프로그램의 장황성을 보다 세밀하게 조정할 수 있습니다.또한, 모두 print원치 않을 수도 있는 통화가 우회됩니다.
제가 필요한 것은 객체(obj)를 출력하는 기능이지만, 글로벌 변수 상세 정보가 참일 때만 그렇지 않으면 아무 것도 하지 않습니다.
저는 언제든지 글로벌 매개변수 "verbose"를 변경할 수 있기를 원합니다.저는 단순성과 가독성이 무엇보다 중요합니다.그래서 저는 다음과 같이 진행할 것입니다.
ak@HP2000:~$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> verbose = True
>>> def vprint(obj):
... if verbose:
... print(obj)
... return
...
>>> vprint('Norm and I')
Norm and I
>>> verbose = False
>>> vprint('I and Norm')
>>>
글로벌 변수 "verbose"도 매개 변수 목록에서 설정할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5980042/how-to-implement-the-verbose-or-v-option-into-a-script
'programing' 카테고리의 다른 글
| maven Failsafe가 java.lang에서 실패합니다.클래스 정의를 찾을 수 없음 오류 (0) | 2023.07.22 |
|---|---|
| 셸 스크립트에서 mariadb 암호의 특수 문자를 이스케이프하는 방법 (0) | 2023.07.22 |
| Oracle에서 지정된 행을 삭제하는 최적의 방법 (0) | 2023.07.22 |
| 아이폰을 C++로 프로그래밍할 수 있습니까? (0) | 2023.07.17 |
| numpy, scipy, matplotlib 및 pylab 간의 혼동 (0) | 2023.07.17 |