Skip to content

Latest commit

ย 

History

History
139 lines (88 loc) ยท 5.45 KB

File metadata and controls

139 lines (88 loc) ยท 5.45 KB

Better way 04. ๋ณต์žกํ•œ ํ‘œํ˜„์‹ ๋Œ€์‹  ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์ž

24์ชฝ

  • Created : 2016/09/18
  • Modified: 2019/05/03

1. ์˜ˆ์ œ ์‚ดํŽด๋ณด๊ธฐ

ํŒŒ์ด์ฌ์˜ ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ๋กœ์ง์„ ํ‘œํ˜„์‹ ํ•œ ์ค„๋กœ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, URL์—์„œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋””์ฝ”๋“œํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๋‹ค์Œ ์˜ˆ์—์„œ ๊ฐ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ •์ˆ˜ ๊ฐ’์ด๋‹ค.

from urllib.parse import parse_qs
# urllib.parse๋Š” python 3์˜ ๋ชจ๋“ˆ์ด๋‹ค. 2์˜ ๊ฒฝ์šฐ์—” urlparse ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์ž.


my_values = parse_qs('red=5&blue=0&green=',keep_blank_values=True)
# parse_qs์—์„œ 'qs'๋Š” 'query string'์˜ ์•ฝ์ž์ธ๋“ฏ.

parse_qs() ์˜ ์ธ์ž์— ๋”ฐ๋ผ ํŠน์ • ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์ด ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ•œ ๊ฐœ๋งŒ ์žˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ฐ’์ด ๋น„์–ด์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์— get ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋‹ค.

print('Red     ',my_values.get('red'))
print('Green   ',my_values.get('green'))
print('Opacity ',my_values.get('opacity'))

Red      ['5']
Green    ['']
Opacity  None

my_values ๋ผ๋Š” ๋”•์…”๋„ˆ๋ฆฌ์—๋Š” 'opacity'๋ผ๋Š” ํ‚ค๊ฐ€ ์—†๋‹ค. dict.get ๋ฉ”์†Œ๋“œ๋Š” ์—†๋Š” ํ‚ค๋ฅผ ์š”๊ตฌ๋ฐ›์•˜์„ ๋•Œ None์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
'green'์ฒ˜๋Ÿผ ๊ฐ’์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜, 'opacity'์ฒ˜๋Ÿผ None์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 0์ด ํ• ๋‹น๋œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค. ์ด ์ž‘์—…์„ ๋ถˆ(bool)๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํŒŒ์ด์ฌ์˜ ๋ฌธ๋ฒ• ๋•๋ถ„์— ๋ถˆ ํ‘œํ˜„์‹์œผ๋กœ๋„ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠธ๋ฆญ์€ ํŒŒ์ด์ฌ์˜ ์กฐ๊ฑด๋ฌธ์—์„œ๋Š” ๋นˆ ๋ฌธ์ž์—ด, ๋นˆ ๋ฆฌ์ŠคํŠธ, 0์ด ๋ชจ๋‘ False๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ํ‘œํ˜„์‹๋“ค์˜ ๊ฒฐ๊ณผ๋Š” ์ฒซ ๋ฒˆ์งธ ์„œ๋ธŒ ํ‘œํ˜„์‹์ด False์ผ ๋•Œ 'or' ์—ฐ์‚ฐ์ž ๋’ค์— ์˜ค๋Š” ์„œ๋ธŒ ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•œ ๊ฐ’์ด ๋œ๋‹ค.

red = my_values.get('red', [''])[0] or 0
green = my_values.get('green', [''])[0] or 0
opacity = my_values.get('opacity', [''])[0] or 0

print('Red     :     %r' % red)
print('Green   :     %r' % green)
print('Opacity :     %r' % opacity)

Red     :     '5'
Green   :     0
Opacity :     0

'red'์˜ ๊ฒฝ์šฐ๋Š” ํ‚ค๊ฐ€ my_values ์•ˆ์— ์žˆ๋‹ค. ๊ฐ’์€ '5'๋งŒ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์•”์‹œ์ ์œผ๋กœ True๊ฐ€ ๋˜๋ฏ€๋กœ 'red'๋Š” or ํ‘œํ˜„์‹์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค.

'green'์˜ ๊ฒฝ์šฐ๋Š” ํ‚ค๋Š” ์žˆ์œผ๋‚˜ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋นˆ ๋ฌธ์ž์—ด์€ ์•”์‹œ์ ์œผ๋กœ False์ด๋ฏ€๋กœ or ํ‘œํ˜„์‹์˜ ๊ฒฐ๊ณผ๋Š” 0์ด ๋œ๋‹ค.

'opacity'์˜ ๊ฒฝ์šฐ ํ‚ค ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. get ๋ฉ”์„œ๋“œ๋Š” ๋”•์…”๋„ˆ๋ฆฌ์— ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์œ„์˜ ์ฝ”๋“œ์—์„œ 'green'๊ณผ 'opacitiy'๊ฐ€ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.


2. ์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

์ด ํ‘œํ˜„์‹์€ ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ์ž‘์—…์„ ๋‹ค ์ˆ˜ํ–‰ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค. ์œ„์—์„œ ์ˆซ์ž 5๋Š” '5', ์ฆ‰ ๋ฌธ์ž 5๋กœ ํ‘œํ˜„๋˜์—ˆ๋Š”๋ฐ ์ด๋ฅผ ์ •์ˆ˜ํ™”ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

red = int(my_values.get('red', [''])[0] or 0)

์œ„ ์ฝ”๋“œ๋Š” ์ฝ๊ธฐ ๋ฌด์ฒ™ ์–ด๋ ต๋‹ค. ์‹œ๊ฐ์  ๋ฐฉํ•ด ์š”์†Œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ๋ณด๋Š” ์‚ฌ๋žŒ์€ ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋ถ€๋ถ„์„ ๋–ผ์–ด๋‚ด์„œ ์ดํ•ดํ•˜๋А๋ผ ์‹œ๊ฐ„์„ ๋งŽ์ด ๋บ๊ธธ ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„๋กœ ์งง๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ์ •๋ง ์ค‘์š”ํ•œ ๊ฑด ๊ฐ€๋…์„ฑ์ด๋‹ค. ํ•œ ์ค„์— ๋ชจ๋‘ ์ง‘์–ด๋„ฃ๋Š” ๊ฑด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.


2.1. ํ•ด๊ฒฐ์ฑ… 1: if / else๋กœ ์ข€ ๋” ์‰ฝ๊ฒŒ ์‹œ๊ฐํ™”ํ•˜๊ธฐ

ํŒŒ์ด์ฌ 2.5์— ์ถ”๊ฐ€๋œ if/else ์กฐ๊ฑด์‹(์‚ผํ•ญ ์กฐ๊ฑด์‹)์„ ํ™œ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์งง๊ฒŒ ํ•˜๋ฉด์„œ๋„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

red = my_values.get('red',[''])
red = int(red[0]) if red[0] else 0

์ด ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„ ๋” ๋Š˜์–ด๋‚˜๊ธด ํ–ˆ์ง€๋งŒ ํ›จ์”ฌ ๋‚ซ๋‹ค. ๋œ ๋ณต์žกํ•œ ์ƒํ™ฉ์—์„œ๋Š” if / else ์กฐ๊ฑด์‹์„ ์“ฐ๋ฉด ์ฝ”๋“œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹์„ ๋” ํŽผ์ณ ๋ชจ๋“  ๋กœ์ง์„ ๊ธธ๊ฒŒ ๋ณด๋ฉด ๋” ์ง๊ด€์ ์ด๋‹ค.

green = my_values.get('green', [''])
if green[0]:
    green = int(green[0])
else:
    green = 0

2.1. ํ•ด๊ฒฐ์ฑ… 2: ํ—ฌํผ ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

ํ—ฌํผ ํ•จ์ˆ˜์˜ ํ•„์š”์„ฑ

์ด ๋กœ์ง์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์ข‹๋‹ค.

def get_first_int(values, key, default=0):
    found = values.get(key, [''])
    if found[0]:
        found = int(found[0])
    else:
        found = default
    return found

์œ„์˜ ํ—ฌํผํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด or๋ฅผ ์‚ฌ์šฉํ•œ ๋ณต์žกํ•œ ํ‘œํ˜„์‹์ด๋‚˜ if/else ์กฐ๊ฑด์‹์„ ์‚ฌ์šฉํ•œ ๋‘ ์ค„์งœ๋ฆฌ ๋ฒ„์ ผ์„ ์“ธ ๋•Œ๋ณด๋‹ค ํ˜ธ์ถœ ์ฝ”๋“œ๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค.

green = get_first_int(my_values, 'green')

ํ‘œํ˜„์‹์ด ๋ณต์žกํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํ•ด๋‹น ํ‘œํ˜„์‹์„ ์ž‘์€ ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๋กœ์ง์„ ํ—ฌํผ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ์•ˆ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋ฌด์กฐ๊ฑด ์งง์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค๋Š” ๊ฐ€๋…์„ฑ์„ ์„ ํƒํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค. ์ด๋ ‡๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๋ณต์žกํ•œ ํ‘œํ˜„์‹์—๋Š” ํŒŒ์ด์ฌ์˜ ํ•จ์ถ•์ ์ธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.


3. ํ•ต์‹ฌ ์ •๋ฆฌ

  • ํŒŒ์ด์ฌ์˜ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ํ•œ ์ค„์งœ๋ฆฌ ํ‘œํ˜„์‹์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.
  • ๋ณต์žกํ•œ ํ‘œํ˜„์‹์€ ํ—ฌํผ ํ•จ์ˆ˜๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ์ข‹๋‹ค. ํŠนํžˆ, ๊ฐ™์€ ๋กœ์ง์„ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž.
  • if / else ํ‘œํ˜„์‹์„ ์ด์šฉํ•˜๋ฉด or๋‚˜ and ๊ฐ™์€ ๋ถˆ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ์ฝ๊ธฐ ์ˆ˜์›”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.