 
  
  
  ไพธอนสามารถรันผ่านคอมมานด์ไลน์ได้ และสามารถใส่ค่าเพิ่มเข้ามาเพิ่มเข้าในโปรแกรมเพื่อให้เปลี่ยนผลการรันในแต่ละครั้งได้
  ดังที่อธิบายไปใน
https://phyblas.hinaboshi.com/20190705
  
  แต่นอกจากนี้แล้วไพธอนยังได้เตรียมมอดูล argparse ไว้
  ซึ่งเอาไว้สำหรับปรับแต่งการรับค่าเข้าไปยังโปรแกรมเมื่อรันผ่านคอมมานด์ไลน์
  
  นอกจาก argparse แล้วก็ยังมีมอดูลอื่นเช่น click และ fire ซึ่งถ้าใช้แล้วอาจสามารถเขียนง่ายกว่า argparse
  แต่ไม่ใช่มอดูลที่มีอยู่แต่แรก ต้องติดตั้งเพิ่ม ดังนั้นจึงไม่ได้ใช้กว้างขวางเท่า
  
  ในบทความนี้จะอธิบายวิธีการใช้ argparse
  
  
  
  
  
การสร้างตัวแปรที่ป้อนเพิ่มเข้าโปรแกรม
  
  รูปแบบหนึ่งในการรันผ่านคอมมานด์ไลน์ที่นิยมใช้ก็คือเติมค่าอาร์กิวเมนต์ คือตัวแปรบางอย่างที่ต้องการลงไป
  
  ยกตัวอย่างเช่น ต้องการโปรแกรมที่รับค่าตัวแปรเป็นตัวเลข ๒ ตัวคือ x กับ y โดยเขียนแบบนี้
  
๛ python alpaka.py -x 3 -y 7
  
  แบบนี้จะหมายความว่ารันโปรแกรม alpaka.pyโดยให้ ค่า x เป็น 3 ค่า y เป็น 7
  
  โปรแกรมในลักษณะแบบนี้สามารถเขียนได้โดยใช้ argparse แบบนี้
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x')
p.add_argument('-y')
pa = p.parse_args()
print(pa)
print('x เป็น %s, y เป็น %s'%(pa.x,pa.y))
  
  ลองเอามารันจะได้ผลแบบนี้
  
๛ python alpaca.py -x 2 -y 4
Namespace(x='2', y='4')
x เป็น 2, y เป็น 4
๛ python alpaca.py -x 3 -y 7     
Namespace(x='3', y='7')
x เป็น 3, y เป็น 7
  
  ตัวอย่างต่อจากนี้ก็ไปจะใช้ชื่อไฟล์ที่จะรันว่า alpaca.py แล้วก็สั่งรันในคอมมานด์ไลน์แล้วดูผลทันที เครื่องหมาย ๛
  จะใช้แทนบรรทัดที่พิมพ์ ส่วนบรรทัดถัดมาคือผลลัพธ์ แบบในตัวอย่างนี้
  
  ต่อไปเป็นคำอธิบายวิธีการเขียน
  
  เริ่มแรกคือต้อง import มอดูล argparse เพื่อมาใช้ แล้วก็สร้างออบเจ็กต์ argparse.ArgumentParser ขึ้นมา
  ออบเจ็กต์นี้จะใช้เพื่อเป็นตัวกลางในการสร้างปรับแต่งการรันในคอมมานด์ไลน์
  
  ต่อมาเอาออบเจ็กต์นี้มาใช้ โดยการใช้เมธอด .add_argument() จะเป็นการสร้างตัวแปรที่ต้องการรับจากคอมมานด์ไลน์ขึ้นมา
  
  จากนั้นใช้เมธอด .parse_args() จะได้ตัวออบเจ็กต์ Namespace ที่เก็บค่าตัวแปรที่รับมา
  และค่าตัวแปรก็จะเก็บอยู่ในแอตทริบิวต์ของออบเจ็กต์นั้นตามชื่อ เอามาใช้ในโปรแกรมได้
  
  ชื่อตัวแปรจะตั้งชื่อเป็นอะไรก็ได้ แต่มีบางชื่อที่ห้ามใช้ เพราะไปซ้ำกับที่มีอยู่แล้ว เช่น -h หรือ --help
  เพราะนี่เป็นคำสั่งสำหรับแสดงคำอธิบายในการใช้ (จะอธิบายถึงทีหลัง)
  
  
  
  
  
การกำหนดชนิดข้อมูลของตัวแปร
  
  ค่าตัวแปรที่รับมาปกติจะอยู่ในรูปของสายอักขระ แต่นอกจากนั้นแล้วเราสามารถกำหนดชนิดของตัวแปร เช่น int float
  ลงไปได้โดยใส่คีย์เวิร์ด type
  แล้วก็จะถูกแปลงเป็นชนิดนั้นให้เอง แต่ถ้าไม่ใส่จะเป็น str (สายอักขระ)
  
  ตัวอย่างการตั้งชนิดข้อมูลให้ตัวแปร
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x')
p.add_argument('-y',type=int)
p.add_argument('-z',type=float)
pa = p.parse_args()
print(pa)
print(type(pa.x))
print(type(pa.y))
print(type(pa.z))
  ๛ python alpaca.py -x 3 -y 5 -z 7
Namespace(x='3', y=5, z=7.0)
<class 'str'>
<class 'int'>
<class 'float'>
  
  ที่จริงแล้ว type ไม่ได้ใช้ได้แค่พวกชนิดข้อมูลทั่วไป สามารถใส่เป็นฟังก์ชันที่กำหนดเองก็ได้
  เช่นลองแทนด้วยฟังก์ชันที่ใส่แล้วยาวขึ้น ๒ เท่า และมีการแต่งเติมอักษรทางซ้ายขวา
  
import argparse
def f(s):
    return '^*-'+s*2+'-*^'
p = argparse.ArgumentParser()
p.add_argument('-x',type=f)
print(p.parse_args())
  ๛ python alpaca.py -x คิระคิระ
Namespace(x='^*-คิระคิระคิระคิระ-*^')
  
  เมื่อกำหนด type แล้ว
  ค่าที่รับเข้าไปก็จะถูกผ่านเข้าไปในฟังก์ชันนั้นแล้วค่าที่คืนกลับจากฟังก์ชันก็จะกลายเป็นค่าตัวแปรนั้น
  
  
  
  
  
ค่าตั้งต้นของตัวแปร
  
  ตัวแปรที่กำหนดขึ้นมานั้นจะใส่ค่าหรือไม่ใส่ก็ได้ ถ้าไม่ได้ใส่ค่าเข้าไปก็จะได้ None
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x')
p.add_argument('-y')
pa = p.parse_args()
print(pa)
  ๛ python alpaca.py
Namespace(x=None, y=None)
๛ python alpaca.py -x 32
Namespace(x='32', y=None)
๛ python alpaca.py -y 23
Namespace(x=None, y='23')
  
  หากต้องการให้มีค่าตั้งต้นไม่ให้เป็น None ก็ใส่คีย์เวิร์ด default
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',default=9)
p.add_argument('-y',default=1)
print(p.parse_args())
  ๛ python alpaca.py -x 3
Namespace(x='3', y=1)
๛ python alpaca.py -y 31
Namespace(x=9, y='31')
  
  หากใส่ required=True จะทำให้ตัวแปรนั้นจำเป็นต้องใส่ ถ้าไม่ใส่ก็จะ error
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',required=True)
p.add_argument('-y')
print(p.parse_args())
  ๛ python alpaca.py -y 1
usage: alpaca.py [-h] -x X [-y Y]
alpaca.py: error: the following arguments are required: -x
  
  หากต้องการให้ค่าที่ใส่ได้จำกัดอยู่แค่บางค่าก็ใส่ลิสต์ของค่าที่จำกัดให้ใช้ได้ลงในคีย์เวิร์ด choices
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',choices=['ก','ข','ค'])
print(p.parse_args())
  
  แบบนี้ถ้าใส่ค่าที่ไม่มีอยู่ในตัวเลือกก็จะ error
  
๛ python alpaca.py -x a
usage: alpaca.py [-h] [-x {ก,ข,ค}]
alpaca.py: error: argument -x: invalid choice: 'a' (choose from 'ก', 'ข', 'ค')
  
  
  
  
  ชื่อของตัวแปร
  
  สามารถตั้งชื่อให้ตัวแปรมีชื่อหลายชื่อได้โดยใส่หลายชื่อลงไปทีเดียว เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x','-w')
p.add_argument('-y','-z')
print(p.parse_args())
  
  แบบนี้เวลาใช้ ถ้าใส่เป็น -w ก็จะเหมือนกับใส่ -x และถ้าใส่ -z ก็จะเหมือนกับใส่ -y อย่างไรก็ตาม
  ตัวแปรที่ได้จะเป็นชื่อตามที่กำหนดลงไปเป็นตัวแรก
  
๛ python alpaca.py -w 5            
Namespace(x='5', y=None)
๛ python alpaca.py -x 5
Namespace(x='5', y=None)
๛ python alpaca.py -z 7 -w 5
Namespace(x='5', y='7')
  
  ถ้าหากใส่ตัวที่แทนตัวเดียวกันซ้ำ ตัวที่ใส่ทีหลัง (อยู่ทางขวา) จะถูกใช้
  
๛ python alpaca.py -w 17 -z 21 -x 6
Namespace(x='6', y='21')
๛ python alpaca.py -x 6 -w 17 -z 21
Namespace(x='17', y='21')
  
  ชื่อตัวแปรไม่จำเป็นต้องเป็นแค่อักษรตัวเดียว อาจจะเป็นคำก็ได้ แต่โดยทั่วไปแล้วถ้าไม่ใช่อักษรตัวเดียวมักจะใช้ขีด ๒
  ขีดแทน เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('--uke')
p.add_argument('--seme')
print(p.parse_args())
  ๛ python alpaca.py --uke a --seme b
Namespace(seme='b', uke='a')
  
  วิธีเขียนแบบหนึ่งที่อาจเจอบ่อยก็คือตั้งให้เขียนได้ ๒ แบบ ทั้งย่อตัวเดียวและเป็นคำ
  เพียงแต่กรณีที่มีทั้งตัวที่ขึ้นต้นด้วย ๑ ขีด - และ ๒ ขีด -- อยู่พร้อมกันแบบนี้ ชื่อตัวแปรหลักที่ได้จะเป็นตัวที่ใช้ ๒
  ขีด -- แม้ว่าจะใส่ตัว ๒ ขีดไว้ทีหลังก็ตาม เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-u','--uke')
p.add_argument('-s','--seme')
print(p.parse_args())
  ๛ python alpaca.py -u x -s y       
Namespace(seme='y', uke='x')
  
  นอกจากนี้แล้ว หากต้องการกำหนดชื่อตัวแปรให้ต่างไปจากที่เขียนในคอมมานด์ไลน์ก็ทำได้โดยใส่คีย์เวิร์ด dest
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-u','--uke',dest='ukete')
p.add_argument('-s','--seme',dest='semete')
print(p.parse_args())
  ๛ python alpaca.py -u x -s y
Namespace(semete='y', ukete='x')
  
  
  
  
  ตัวแปรที่ไม่ต้องใส่ค่า สนแค่ว่ามีหรือไม่มี
  
  ถ้าต้องการตัวแปรที่ไม่จำเป็นต้องใส่ค่าอะไร แค่สนว่ามีการใส่ตัวแปรนั้นไปด้วยหรือเปล่า แบบนี้ใช้คีย์เวิร์ด action
  เพื่อทำได้
  
  ให้ใส่ action เป็น store_const แล้วใส่ค่า const เป็นค่าที่จะให้เป็นเมื่อมีใส่
  และหากต้องการให้มีค่าเมื่อไม่ใส่ด้วยก็ใส่ที่
  default เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',action='store_const',const=1,default=5)
p.add_argument('-y',action='store_const',const=2)
p.add_argument('-z',action='store_const',const=3,default=4)
print(p.parse_args())
  ๛ python alpaca.py -x
Namespace(x=1, y=None, z=4)
๛ python alpaca.py -z -y
Namespace(x=5, y=2, z=3)
  
  จะเห็นว่าเมื่อใช้ action='store_const' แบบนี้แล้ว ข้างหลังตัวแปรจะไม่ต้องใส่ค่าลงไป ใส่ลงไปโดดๆ
  และตำแหน่งต่อมาก็ตามด้วยตัวแปรตัวอื่นต่อได้เลย
  
  หากต้องการตัวแปรที่เป็น True หรือ False อาจใช้ action เป็น store_true หรือ store_false
  
  โดย store_true จะให้ค่า True เมื่อมีการใส่ และให้ False เมื่อไม่ใส่ ส่วน store_false จะกลับกัน คือให้ค่า True
  เมื่อไม่มีการใส่ และให้ False เมื่อใส่ อย่างไรก็ตามถ้ามีการใส่ค่า default ก็จะเป็นค่านั้นแทนเมื่อไม่มีการใส่
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',action='store_true')
p.add_argument('-y',action='store_false')
p.add_argument('-z',action='store_true',default=5)
print(p.parse_args())
  ๛ python alpaca.py -z
Namespace(x=False, y=True, z=True)
๛ python alpaca.py -x -y
Namespace(x=True, y=False, z=5)
  
  ถ้ากำหนด action เป็น count จะเป็นการนับจำนวนว่ามีการใส่ตัวนั้นกี่ครั้ง สำหรับตัวแปรขีดเดียวแบบนี้จะเขียนติดๆกันไปก็ได้
  ถ้าไม่ใส่เลยจะได้ None ถ้าไม่ได้กำหนดค่า default
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',action='count')
p.add_argument('-y',action='count')
p.add_argument('-z',action='count',default=0)
print(p.parse_args())
  ๛ python alpaca.py -x -x
Namespace(x=2, y=None, z=0)
๛ python alpaca.py -xyxyzx
Namespace(x=3, y=2, z=1)
๛ python alpaca.py -xyx -zyzzy
Namespace(x=2, y=3, z=3)
  
  
  
  
  การรับตัวแปรเป็นลิสต์
  
  หากใส่ action เป็น append จะทำให้ค่าตัวแปรได้เป็นลิสต์ โดยใส่ซ้ำกี่ตัวก็จะได้ค่าที่ใส่นั้นมาใส่ในลิสต์
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',action='append')
p.add_argument('-y',action='append',type=int)
print(p.parse_args())
  ๛ python alpaca.py -x ไก่ -x ไข่ -y 1 -x ควาย -y 7
Namespace(x=['ไก่', 'ไข่', 'ควาย'], y=[1, 7])
๛ python alpaca.py -x นึง -x ส่อง -x ซั่ม
Namespace(x=['นึง', 'ส่อง', 'ซั่ม'], y=None)
  
  ถ้า action เป็น append_const จะเป็นตัวแปรที่ไม่ต้องมีการป้อนค่าตามมา แต่จะนับจำนวนแล้วได้ลิสต์ของค่าที่ระบุใน const
  เป็นจำนวนตามเท่านั้น ถ้าไม่ใส่เลยจะได้
  None
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-a',action='append_const',const='เอ',default=[])
p.add_argument('-b',action='append_const',const='บี')
print(p.parse_args())
  ๛ python alpaca.py -aa   
Namespace(a=['เอ', 'เอ'], b=None)
๛ python alpaca.py -bb
Namespace(a=[], b=['บี', 'บี'])
๛ python alpaca.py -baba    
Namespace(a=['เอ', 'เอ'], b=['บี', 'บี'])
  
  นอกจากนี้ถ้ากำหนด nargs ก็จะทำให้ได้เป็นค่าเป็นลิสต์ที่มีขนาดตามจำนวนที่ระบุ โดยต้องใส่ค่าหลังจากนั้นตามจำนวน
  และต้องใส่จำนวนเท่านั้นพอดี ใส่เกินหรือขาดก็จะ error
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',nargs=2)
p.add_argument('-y',nargs=3)
p.add_argument('-z',nargs=1)
print(p.parse_args())
  ๛ python alpaca.py -x 3 3 -y 2 2 1 -z 3
Namespace(x=['3', '3'], y=['2', '2', '1'], z=['3'])
๛ python alpaca.py -x 4 5 -y 7 5 1
Namespace(x=['4', '5'], y=['7', '5', '1'], z=None)
๛ python alpaca.py -x 8 17
Namespace(x=['8', '17'], y=None, z=None)
๛ python alpaca.py -x 3 3 -y 2 2
usage: alpaca.py [-h] [-x X X] [-y Y Y Y] [-z Z]
alpaca.py: error: argument -y: expected 3 arguments
๛ python alpaca.py -x 4 5 7
usage: alpaca.py [-h] [-x X X] [-y Y Y Y] [-z Z]
alpaca.py: error: unrecognized arguments: 7
  
  หากต้องการให้เป็นลิสต์ที่ไม่จำกัดจำนวน ก็อาจใส่เป็น *
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-x',nargs='*')
print(p.parse_args())
  ๛ python alpaca.py -x        
Namespace(x=[])
๛ python alpaca.py -x 4 3 2 1
Namespace(x=['4', '3', '2', '1'])
๛ python alpaca.py -x 4 3 2
Namespace(x=['4', '3', '2'])
๛ python alpaca.py
Namespace(x=None)
  
  หรืออาจใส่เป็น + ถ้าต้องการให้ต้องมีอย่างน้อยตัวนึง แบบนี้ถ้ามีตัวแปรนั้นแล้วไม่ใส่ค่าอะไรต่อเลยก็จะ error
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-y',nargs='+')
print(p.parse_args())
  ๛ python alpaca.py -y        
usage: alpaca.py [-h] [-y Y [Y ...]]
alpaca.py: error: argument -y: expected at least one argument
๛ python alpaca.py -y 8
Namespace(y=['8'])
๛ python alpaca.py     
Namespace(y=None)
  
  ถ้าใส่เป็น ? จะไม่เป็นลิสต์ แต่ได้เป็นตัวแปรที่จะไม่ใส่ หรือใส่เฉยๆ หรือใส่พร้อมป้อนค่า ก็ได้ ถ้าไม่ใส่จะได้ค่า
  default ถ้าใส่จะได้ค่าตามที่ระบุใน const ถ้าใส่ก็จะได้ค่าตามนั้น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-o',nargs='?',const='โอ',default='เอ็กซ์')
print(p.parse_args())
  ๛ python alpaca.py -o
Namespace(o='โอ')
๛ python alpaca.py -o "โอเอ็กซ์"
Namespace(o='โอเอ็กซ์')
๛ python alpaca.py
Namespace(o='เอ็กซ์')
  
  
  
  
  ตัวแปรที่รับค่าตามลำดับ
  
  นอกจากจะสร้างตัวแปรที่ต้องใส่ชื่อเวลาป้อนค่าแล้ว ยังสามารถสร้างตัวแปรที่ได้ค่าโดยขึ้นกับลำดับด้วย
  วิธีการสร้างคล้ายเดิม แค่ไม่ต้องใส่ - หรือ -- นำหน้าเวลาสร้าง เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('tuaraek')
p.add_argument('tuatopai')
p.add_argument('tuatopaiik')
print(p.parse_args())
  ๛ python alpaca.py ตัวแรก ตัวต่อไป ตัวต่อไปอีก
Namespace(tuaraek='ตัวแรก', tuatopai='ตัวต่อไป', tuatopaiik='ตัวต่อไปอีก')
  
  แบบนี้ตัวแปรจะรับค่าที่ใส่ต่อจากชื่อโปรแกรม และค่าของตัวแปรแต่ละตัวจะเป็นไปตามลำดับที่ใส่ 
  
  สามารถใส่ตัวแปรทั้งแบบป้อนตามชื่อและแบบป้อนตามลำดับไปได้พร้อมกัน และเวลาป้อนค่าจะใส่อันไหนก่อนก็ได้
  
p = argparse.ArgumentParser()
p.add_argument('a')
p.add_argument('-b')
p.add_argument('-c')
p.add_argument('d')
print(p.parse_args())
  ๛ python alpaca.py อา ดา -b บา -c คา
Namespace(a='อา', b='บา', c='คา', d='ดา')
๛ python alpaca.py อา -b เบ -c เซ เด
Namespace(a='อา', b='เบ', c='เซ', d='เด')
๛ python alpaca.py -c คะ -b บะ อะ ดะ
Namespace(a='อะ', b='บะ', c='คะ', d='ดะ')
  
  
  
  
  การใช้ไฟล์เป็นค่าป้อนเข้าให้ตัวแปร
  
  ถ้าต้องใช้ไฟล์เป็นค่าป้อนเข้าให้ตัวแปรให้ใส่ type ตัวแปรนั้นเป็น argparse.FileType() โดยในวงเล็บใส่โหมด เช่น r คืออ่าน
  w คือเขียน (เพียงแต่ว่า r เป็นค่าตั้งต้นอยู่แล้ว จะละไว้ก็ได้)
  
  ตัวแปรที่ได้จะสามารถนำมาใช้ได้เหมือนเวลาเปิดไฟล์ด้วย open() คือถ้าเปิดโหมดอ่านก็ใช้ .read() หรือ .readline()
  เพื่ออ่านข้อความจากไฟล์ได้ เปิดโหมดเขียนก็ใช้ .write() เพื่อเขียนข้อความใส่ไฟล์ได้
  
  ตัวอย่าง เปิดไฟล์ขึ้นมาอ่าน
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('--fr',type=argparse.FileType())
pa = p.parse_args()
print(pa)
print(pa.fr.read())
pa.fr.close()
  ๛ python alpaca.py --fr mochi.txt
Namespace(fr=<_io.TextIOWrapper name='mochi.txt' mode='r' encoding='UTF-8'>)
(เนื้อหาในไฟล์นี้)
  
  ตัวอย่างการเปิดไฟล์เพื่อเขียนข้อความลงไป
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('--fw',type=argparse.FileType('w'))
pa = p.parse_args()
print(pa)
pa.fw.write('ยัดข้อความลงไฟล์')
pa.fw.close()
  ๛ python alpaca.py --fw machi.txt
Namespace(fw=<_io.TextIOWrapper name='kaki.txt' mode='w' encoding='UTF-8'>)
  
  
  
  
  การดูและใส่เพิ่มคำอธิบายโปรแกรม
  
  หากพิมพ์ชื่อไฟล์แล้วตามด้วย -h หรือ --help จะมีคำอธิบายโปรแกรมขึ้นมา ซึ่งบอกให้รู้ว่ามีตัวแปรอะไรบ้าง เช่น
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('e')
p.add_argument('-b')
p.add_argument('-c')
p.add_argument('p')
print(p.parse_args())
  ๛ python alpaca.py -h
usage: alpaca.py [-h] [-b B] [-c C] e p
positional arguments:
  e
  p
optional arguments:
  -h, --help  show this help message and exit
  -b B
  -c C
  
  ตัวแปรแบบตามลำดับจะแสดงอยู่ในส่วนของ positional arguments ส่วนตัวแปรแบบตามชื่อจะอยู่ที่ optional arguments
  โดยตรงนี้จะมี -h --help อยู่ด้วยเสมอ เป็นสิ่งที่มีอยู่แต่แรกแล้ว
  
  ตรง usage นี้ปกติจะถูกสร้างให้โดยอัตโนมัติโดยแสดงชื่อโปรแกรมและแนะนำตัวแปรที่เราใช้คร่าวๆ
  
  ในที่นี้ B C ที่อยู่ทางขวาของ -b -c ใช้แทนตัวค่าที่ต้องการใส่เข้าไป
  โดยปกติจะถูกตั้งให้อัตโนมัติเป็นตัวพิมพ์ใหญ่ของชื่อนั้น
  
  แต่หากต้องการเปลี่ยนเป็นชื่อที่ต้องการก็ได้โดยใส่คีย์เวิร์ด metavar (เพียงแต่ก็ไม่ได้มีผลอะไรต่อโปรแกรม
  แค่เปลี่ยนเวลาแสดงผลในคำอธิบายเท่านั้น)
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('-a','--anime',metavar='x')
p.add_argument('-g','--game')
p.parse_args()
  python alpaca.py -h
usage: alpaca.py [-h] [-a x] [-g GAME]
optional arguments:
  -h, --help            show this help message and exit
  -a x, --anime x
  -g GAME, --game GAME
  
  ในที่นี้ตัวแปรหลัง -a ถ้าไม่ใส่ metavar ก็คงจะเป็น ANIME แต่ใส่ metavar เป็น x จึงแทนด้วย x แทน
  
  ในส่วนของชื่อโปรแกรมซึ่งแสดงอยู่ใน usage ปกติจะเป็นชื่อไฟล์ ในที่นี้คือ alpaca.py แต่สามารถเปลี่ยนใหม่ได้โดยเติมคีย์เวิร์ด prog
  
import argparse
p = argparse.ArgumentParser(prog='อัลปากา')
p.parse_args()
  ๛ python alpaca.py -h
usage: อัลปากา [-h]
optional arguments:
  -h, --help  show this help message and exit
  
  ถ้าอยากพิมพ์ข้อความอธิบายจากภายในตัวโปรแกรมเองเลยโดยไม่ต้องใช้ -h หรือ --help ก็ใช้เมธอด .print_help() ได้
  
import argparse
p = argparse.ArgumentParser()
p.print_help()
  ๛ python alpaca.py   
usage: alpaca.py [-h]
optional arguments:
  -h, --help  show this help message and exit
  
  ถ้าใช้เมธอด .print_usage() จะแสดงส่วน usage
  
import argparse
p = argparse.ArgumentParser()
p.print_usage()
  ๛ python alpaca.py             
usage: alpaca.py [-h]
  
  .print_help() กับ .print_usage() จะเป็นการแสดงค่าออกมาทันที แต่หากต้องการให้เป็นสายอักขระ เพื่อจะเอามาใช้ทำอะไรก่อน
  แทนที่จะแสดงค่าทันที ก็อาจใช้ format_help() กับ format_usage()
  
import argparse
p = argparse.ArgumentParser()
print(p.format_help().split('\n'))
print(p.format_usage().split('\n'))
  ๛ python alpaca.py
['usage: alpaca.py [-h]', '', 'optional arguments:', '  -h, --help  show this help message and exit', '']
['usage: alpaca.py [-h]', '']
  
  หากอยากเขียนคำอธิบาย usage เป็นอย่างอื่นทับไปแทน usage ที่มีอยู่แล้วแต่แรกก็ทำได้โดยใส่คีย์เวิร์ด usage
  
import argparse
p = argparse.ArgumentParser(usage='ใช้ไปเหอะไม่ต้องไรมาก')
p.parse_args()
  ๛ python alpaca.py -h
usage: ใช้ไปเหอะไม่ต้องไรมาก
optional arguments:
  -h, --help  show this help message and exit
  
  สามารถเพิ่มคำอธิบายตัวโปรแกรมไปโดยใส่คีย์เวิร์ด description และ epilog ใน ArgumentParser
  ส่วนคำอธิบายตัวแปรแต่ละตัวใส่ลงคีย์เวิร์ด help
  
  ตัวอย่างการใช้
  
import argparse
p = argparse.ArgumentParser(description='อัลปากาน่ารัก',epilog='อัลปากาไปแล้ว')
p.add_argument('equador',help='เอกวาดอร์')
p.add_argument('-b','--bo','--bolivia',help='โบลีเวีย',metavar='b')
p.add_argument('--chile',help='ชีเล',metavar='c')
p.add_argument('peru',help='เปรู')
p.parse_args()
  ๛ python alpaca.py -h
usage: alpaca.py [-h] [-b b] [--chile c] equador peru
อัลปากาน่ารัก
positional arguments:
  equador               เอกวาดอร์
  peru                  เปรู
optional arguments:
  -h, --help            show this help message and exit
  -b b, --bo b, --bolivia b
                        โบลีเวีย
  --chile c             ชีเล
อัลปากาไปแล้ว
  
  คำอธิบายใน description จะปรากฏด้านบน ส่วนใน epilog จะปรากฏปิดท้าย
  
  สามารถที่จะไม่ให้ใช้ -h หรือ --help เป็นคำอธิบายได้โดยใส่คีย์เวิร์ด add_help=False แบบนี้ตัวแปร -h และ --help
  ก็สามารถเอาไปใช้ทำอย่างอื่นแทนได้
  
import argparse
p = argparse.ArgumentParser(add_help=False)
p.add_argument('-h')
p.add_argument('--help')
pa = p.parse_args()
print(pa)
  ๛ python alpaca.py -h 1 --help 2
Namespace(h='1', help='2')
  
  
  
  
  การเปลี่ยนอักษรนำหน้าจาก - เป็นอย่างอื่น
  
  ปกติพวกตัวแปรที่ใส่ค่าตามชื่อจะขึ้นต้นด้วย - แต่ว่าก็สามารถเปลี่ยนให้เป็นอย่างอื่นแทนได้โดยระบุที่คีย์เวิร์ด
  prefix_chars ใน ArgumentParser สามารถใส่หลายตัวพร้อมกัน
  
import argparse
p = argparse.ArgumentParser(prefix_chars='%~+')
p.add_argument('+a')
p.add_argument('%%aa')
p.add_argument('~~aaa')
print(p.parse_args())
  ๛ python alpaca.py +a 1 %%aa 2 ~~aaa 3
Namespace(a='1', aa='2', aaa='3')
  
  help เองก็จะไม่ได้ใช้เป็น -h และ --help แล้ว แต่จะเปลี่ยนเป็นนำด้วยอักษรที่ใส่เป็นตัวแรกใน prefix_chars ในที่นี้คือ
  %
  
๛ python alpaca.py %h
usage: alpaca.py [%h] [+a A] [%%aa AA] [~~aaa AAA]
optional arguments:
  %h, %%help  show this help message and exit
  +a A
  %%aa AA
  ~~aaa AAA
  
  
  
  
  การเปลี่ยนค่าตั้งต้นของตัวแปรทั้งหมด
  
  ปกติถ้าตัวแปรไหนที่ไม่ได้ใส่ค่าจะเป็น None หรือไม่ก็เป็นไปตามที่กำหนดใน default ถ้าหากใส่ไว้
  
  แต่เราสามาตั้งค่าตั้งต้นสำหรับให้ใช้กับทุกค่าแทน None ได้ โดยใส่คีย์เวิร์ด argument_default ใน ArgumentParser (เพียงแต่ตัวไหนใส่ค่า default ก็จะใช้ค่าตามนั้นเป็นค่าตั้งต้นแทน)
  
import argparse
p = argparse.ArgumentParser(argument_default=1)
p.add_argument('-s')
p.add_argument('-t',default=2)
print(p.parse_args())
  ๛ python alpaca.py
Namespace(s=1, t=2)
  
  หากใส่ argument_default=argparse.SUPPRESS จะทำให้ถ้าตัวแปรไหนไม่ได้ใส่ก็จะไม่ปรากฏเลย ยกเว้นจะมีการตั้งค่า default
  ไว้ที่ตัวนั้น
  
import argparse
p = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
p.add_argument('-s')
p.add_argument('-t',default=2)
p.add_argument('-u')
print(p.parse_args())
  ๛ python alpaca.py -u 3
Namespace(t=2, u='3')
๛ python alpaca.py
Namespace(t=2)
  
  
  
  
  การย่อชื่อตัวแปร
  
  ชื่อตัวแปรที่ยาวๆนั้นปกติเวลาใช้งานจริงจะสามารถเขียนย่อสั้นได้
  ตราบใดที่ไม่ซ้ำกับตัวอื่นโปรแกรมก็จะรู้ว่าหมายถึงตัวไหนโดยอัตโนมัติ แต่ถ้าคำที่ใส่ไปซ้ำกัน ๒ ตัวขึ้นไปจึงจะ
  error
  
import argparse
p = argparse.ArgumentParser()
p.add_argument('--atar')
p.add_argument('--atrapar')
p.add_argument('--abrazar')
p.add_argument('--batallar')
print(p.parse_args())
  ๛ python alpaca.py --b 1 --ab 1  
Namespace(abrazar='1', atar=None, atrapar=None, batallar='1')
๛ python alpaca.py --ata 1 --atr 1
Namespace(abrazar=None, atar='1', atrapar='1', batallar=None)
๛ python alpaca.py --at 1         
usage: alpaca.py [-h] [--atar ATAR] [--atrapar ATRAPAR] [--abrazar ABRAZAR]
                 [--batallar BATALLAR]
alpaca.py: error: ambiguous option: --at could match --atar, --atrapar
  
  แต่ถ้าไม่ต้องการให้สามารถย่อแบบนี้ได้ สามารถใส่ allow_abbrev=False ก็จะทำให้ต้องใส่ชื่อเต็มเท่านั้น
  
import argparse
p = argparse.ArgumentParser(allow_abbrev=False)
p.add_argument('--aparar')
print(p.parse_args())
  ๛ python alpaca.py --aparar 1
Namespace(aparar='1')
๛ python alpaca.py --aparar
usage: alpaca.py [-h] [--aparar APARAR]
alpaca.py: error: argument --aparar: expected one argument
  
  
  
  
  การสร้างกลุ่มตัวแปรที่ให้เลือกใส่แค่ตัวใดตัวหนึ่งในกลุ่ม
  
  หากมีตัวแปรหลายตัวที่ต้องการจับเป็นกลุ่มให้เลือกใส่ได้แค่ตัวเดียวสามารถทำได้โดยสร้างกลุ่มขึ้นมาด้วยเมธอด
  .add_mutually_exclusive_group() แล้วจะได้ออบเจ็กต์ตัวกลุ่ม จากนั้นจึงค่อยใช้ .add_argument() กับตัวกลุ่ม
  
  ตัวอย่าง
  
import argparse
p = argparse.ArgumentParser()
g = p.add_mutually_exclusive_group()
g.add_argument('-c')
g.add_argument('-k')
g.add_argument('-q')
print(p.parse_args())
  ๛ python alpaca.py -c กา
Namespace(c='กา', k=None, q=None)
๛ python alpaca.py -q กวา
Namespace(c=None, k=None, q='กวา')
๛ python alpaca.py
Namespace(c=None, k=None, q=None)
๛ python alpaca.py -k เก -q กวา
usage: alpaca.py [-h] [-c C | -k K | -q Q]
alpaca.py: error: argument -q: not allowed with argument -k
  
  จะเห็นว่าใน c k q เมื่อใส่ ๒ ตัวจากในนี้ขึ้นไปก็จะเกิด error
  
  
  
  
  
สรุปคีย์เวิร์ดที่ใส่ได้ใน ArgumentParser
  
  
    
      
        | คีย์เวิร์ด | ความหมาย | ค่าตั้งต้น | 
      
        | prog | ชื่อตัวโปรแกรม | None | 
      
        | usage | คำอธิบายวิธีใช้โปรแกรม | None | 
      
        | description | คำอธิบายโปรแกรม | None | 
      
        | epilog | คำอธิบายส่งท้ายโปรแกรม | None | 
      
        | prefix_chars | อักษรที่เป็นตัวนำหน้าชื่อตัวแปร | None | 
      
        | argument_default | ค่าตั้งต้นของทุกตัวแปร | None | 
      
        | add_help | ทำให้ -h และ --help เป็นตัวเลือกที่บอกคำอธิบาย | True | 
      
        | allow_abbrev | ให้ใช้ชื่อย่อได้ | True | 
    
  
  
  
  
  
  สรุปคีย์เวิร์ดที่ใส่ได้ใน .add_argument
  
  
    
      
        | คีย์เวิร์ด | ความหมาย | ค่าตั้งต้น | 
      
        | action | รูปแบบของตัวแปร | store | 
      
        | nargs | กำหนดจำนวนข้อมูลในลิสต์ตัวแปร |  | 
      
        | const | ค่าคงที่เมื่อใช้ action หรือ nargs |  | 
      
        | default | ค่าตั้งต้น |  | 
      
        | type | ชนิดข้อมูลตัวแปร | str | 
      
        | choices | กำหนดค่าที่จำกัดให้เป็นได้ |  | 
      
        | required | กำหนดว่าเป็นตัวแปรที่ต้องมีแน่นอนหรือไม่ | False | 
      
        | help | คำอธิบายตัวแปรเพิ่มเติม |  | 
      
        | metavar | ชื่อแทนตัวแปรที่ปรากฏในคำอธิบาย |  | 
      
        | dest | ชื่อพรอเพอร์ตี |  | 
    
  
  
  
  
  
  อ้างอิง
  
  