우아한 함수
최근에 소스 스크립트를 살펴보았을 때 명령행 실행 스크립트에 대한 신기한 기교를 발견하고 기록을 하였다.
argparse 라이브러리
얼마 전에 ARgparse에 대해 맛만 보고 그만두었다. 잠자리가 물을 끄는 식으로 공부를 해서 자신이 쓸 수 있을 것 같아서 더 깊이 있게 공부하지 않았다. 그리고 다른 사람의 코드를 읽으면서 자신이 이 물건에 대해 진정으로 깨닫지 못했다는 것을 발견했다.
GitHub에서 관련 스크립트의 코드를 읽을 때 이런 효과가 종종 나타난다.항상 그렇게 많은 각본이 당신의 눈앞을 환하게 할 것이다.그리고 자신도 모르게 자신의 부족한 점을 반성했다.
나는 이것이 또 언제 누락된 것을 조사하고 보완하는 학습 방식이 아니라고 생각한다.하, 좀 빗나갔어.다음은 본론으로 들어가겠습니다.
요약
틀림없이 프로그래머로서, 많든 적든 명령줄에 사용될 것이다.Windows 운영 체제를 사용하는 사람도 일부 명령줄에 접근할 가능성이 높다.예를 들어 자신의 노트북이 현재 랜 안에 있는 IP 주소를 확인해 보세요.
그림에서도 명령 뒤에 매개 변수를 따라다니고 조합(파이프 명령의 사용)도 했다. 리눅스 명령행의 예술은 더욱 신기하지만 토론 범위에 있지 않다. 여기는 여러 가지 서술에 불과하다.
이렇게 자신의 프로그램에도 이런 신기한 표현을 하고 싶다면 파라미터를 추가하는 것이 좋은 선택이다.다행히도 파이톤은 마법의 실현을 더욱 쉽게 만들었다.정답 중 하나가 바로 아그파세입니다.
입문
argparse에 대해서도 너무 깊이 생각하지 마세요.그 기능은 우리가 입력한 명령을 해석하고 관련 매개 변수에 일치하는 값을 정확하게 부여하는 것이다.그뿐이야.다음은 간단한 예를 보고 입문한다.
import argparse
parser = argparse.ArgumentParser(description='You can use -h option to see the details of this application')
args = parser.parse_args()
print args
코드와 운행 결과를 관찰하면 발견하기 어렵지 않다.argparse는 클래스 대상인 Namespace에 매개 변수를 정확하게 부여하는 데 도움을 줍니다.그리고 그 속성에 값을 부여하는 작업을 진행했다.그런 다음 스크립트에서 이러한 속성을 코드 실행에 필요한 매개 변수의 실제 참조값으로 사용할 수 있습니다.
argparse에 대한 더 자세한 사용은 블로거 아래의 이 글을 참조할 수 있습니다.argparse 사용 설명
우아한 함수
Python에서는 모든 것이 대상입니다.즉, 클래스든 문자열이든 모두 대상이다.사실 함수도 하나의 대상이고 심지어 클래스의 유형을 나타내는 이 유형도 하나의 대상이다. 이 점은 파이톤 원본에서 상세하게 볼 수 있다.
우아하다는 특성에 대해 먼저 작은 테스트를 보겠습니다.
함수function은 사전의 어떤 키의 값으로 사용할 수 있다는 것을 발견하기 어렵지 않다.그리고
str_function
는function의 별명에 해당하여function 함수를 복제한 다음에 우리는 function 함수를 호출하는 것처럼 마음대로 str_function
함수를 호출할 수 있다.그러면 다음에 작은 예를 하나 더 보겠습니다. 문자열을 사용하면 어떻게 될까요?
잘못 보고하다.그렇다면 왜 이런 문제가 생겼는지 곰곰이 생각해 보자.
회귀 코드에서 function 자체는 하나의 함수로 파이톤 해석기에 의해 사전에 얻어졌다.그리고 사전의 대상에 대해 키 값 쌍의 값은 모든 값이 될 수 있기 때문에function을 값으로 전달할 수 있습니다.그리고 그것은 여전히 함수일 것이다.
반대로 문자열을 사용하면string이 인용하는 것은 하나의 문자열일 뿐입니다.그래서 하나의 함수로 해석될 수 없고 원래의 특성이 이 결과를 결정한다.
이런 문제나 코드가 지혜롭지 못하다고 생각할 수도 있지만, 기초가 명확하지 않으면 이런 오류를 범할 수 있는 경우가 많다.특히 스크립트 언어에 대한 컴파일 차원의 검사가 없으면 문제가 더욱 빈번해질 수 있다.
완전한 작은 예
다음은 완전한 작은 예를 사용하여 총결산한다.코드 운행 결과의 원리를 곰곰이 생각해 볼 수 있다.그리고 우아한 함수의 우아한 특성은 도대체 어디에 나타나는지
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = ' '
# __date__ = '2016/11/26'
# __Desc__ =
import argparse
def func1(param):
print "Func1 is assembled Successfully and the parameter can be setted as {param}".format(param=param)
def func2(param):
print "Func2 is assembled Successfully and the parameter can be setted as {param}".format(param=param)
if __name__ == "__main__":
choices = {
'func1': func1,
'func2': func2,
}
parser = argparse.ArgumentParser(description='You can use -h option to see the details of this application')
parser.add_argument('choice',choices=choices, help='you can choose one of the parameter you want, func1, or func2' )
parser.add_argument('-p', type=int, help='the value you want to attach to the function you want to run.')
args = parser.parse_args()
print type(args)
print args
print args.choice, args.p
function = choices[args.choice]
function(args.p)
용도
우아한 함수의 이 특성에 관해서는 사실 활용되는 곳이 많다.가장 자주 사용하는 것은 사용자가 스크립트의 운행 방식을 결정하도록 하는 것이다.특히 스크립트에는 비슷한 함수 구조가 있지만 기능이 완전히 다르면 더욱 실용적이다.
예를 들어 플러그인이 서버와 클라이언트를 실현할 때 필요한 매개 변수는 대체로 비슷하다(다른 부분은argparse의add argument 방법으로 추가 지정을 할 수 있다).스크립트를 작성할 때 한 스크립트에 쓰는 것을 고려할 수 있다. 이렇게 하면 양자의 유사성과 차이점을 더욱 잘 나타내고 플러그인에 대해 더욱 깊은 인식을 가지게 된다.
플러그인 프로그래밍 시 활용
import argparse, socket
from datetime import datetime
MAX_BYTES = 65535
def server(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('127.0.0.1', port))
print 'Listening at {}'.format(sock.getsockname())
while True:
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode('ascii')
print 'the client at {} says {!r}'.format(address, text)
text = 'your data was {} bytes long!'.format(len(data))
data = text.encode('ascii')
sock.sendto(data, address)
def client(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
text = 'the time is {}'.format(datetime.now())
data = text.encode('ascii')
sock.sendto(data, ('127.0.0.1', port))
print 'the OS assigned me the address {}'.format(sock.getsockname())
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode('ascii')
print 'The server replied {!r}'.format(address, text)
if __name__ == '__main__':
choices = {
'client': client,
'server': server
}
parser = argparse.ArgumentParser(description='send and receive UDP locally!')
parser.add_argument('role', choices=choices, help='which role to play')
parser.add_argument('-p', metavar='PORT', type=int, default=1060, help='UDP port (default 1060)')
args = parser.parse_args()
function = choices[args.role]
function(args.p)
이렇게 하면 스크립트를 실행할 때 선택성을 가질 수 있다.
총결산
하나의 함수를 어떻게 우아하게 운행하는지에 관해서, 여기에 관련된 것은 그야말로 빙산의 일각과 같다.
더 많이 배우려면 고품질의 코드를 많이 읽어야 한다.다행히도 GitHub은 우리에게 이런 좋은 플랫폼을 제공해 주었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[f] 이벤트 귀속 함수와 귀속 해제 함수IE: attachEvent(이벤트 이름, 함수), detachEvent(이벤트 이름, 함수), FF:addeventListener(이벤트 이름, 함수, 캡처 여부), removeEventListerner(이벤트 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.