{"id":642,"date":"2006-03-02T01:09:02","date_gmt":"2006-03-01T16:09:02","guid":{"rendered":"http:\/\/openlook.org\/wp\/?p=642"},"modified":"2006-03-02T01:09:02","modified_gmt":"2006-03-01T16:09:02","slug":"cb-1047","status":"publish","type":"post","link":"https:\/\/openlook.org\/wp\/cb-1047\/","title":{"rendered":"\ud30c\uc774\uc36c 2.5 \ubbf8\ub9ac\ubcf4\uae30 1\ud3b8: with \uc808"},"content":{"rendered":"<p>\n\uc774\uc81c \ud30c\uc774\uc36c\uc5d0 \uc0c8\ub85c\uc6b4 \uac83\uc774 \uacc4\uc18d \ub4e4\uc5b4\uc640\ub3c4 \ub180\ub77c\uc9c0 \uc54a\uc744 \ub9cc\ud07c, \ud30c\uc774\uc36c\uc740 \ub04a\uc784\uc5c6\uc774 \uc0c8\ub85c\uc6b4 \ubb38\ubc95\uc774 \ub9e4 \ubc84\uc804\ub9c8\ub2e4 \ub4e4\uc5b4\uc624\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud30c\uc774\uc36c 2.3\uc5d0\uc11c generator\/bool, 2.4\uc5d0\uc11c generator expression\uc774 \ud558\uc774\ub77c\uc774\ud2b8\uc600\ub2e4\uba74, 2.5\uc5d0\uc11c\ub294 \ub2e8\uc5f0 <a href=\"http:\/\/python.org\/peps\/pep-0343.html\">PEP-343 with \uc808<\/a>\uc774 \uac00\uc7a5 \uc8fc\uc694\ud55c \ubb38\ubc95\uc758 \ubcc0\ud654\uac00 \ub418\uaca0\uc2b5\ub2c8\ub2e4.\n<\/p>\n<p>\nwith \uc808\uc740 \uc774\ubbf8 \ub2e4\ub978 \uc5b8\uc5b4\uc5d0 \ub9ce\uc774 \uc18c\uac1c\uac00 \ub418\uc5b4 \uc788\ub294 \uac1c\ub150\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud55c \uac83\uc778\ub370, ruby\uc758 block\uc774\ub098 \uc790\ubc14\uc758 synchronized \uac19\uc740 \uac83\ub4e4\uacfc \ube44\uc2b7\ud55c \uac1c\ub150\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uadf8\ub807\uc9c0\ub9cc, \ube44\uc8fc\uc5bc \ubca0\uc774\uc2dd\uc758 with\uac19\uc774 \ub124\uc784\uc2a4\ud398\uc774\uc2a4\ub97c \uc904\uc774\ub294 \ubaa9\uc801\uc73c\ub85c \uc4f0\ub294 \uac83\uc740 \uc544\ub2c8\uae30 \ub54c\ubb38\uc5d0 \uc11c\ub85c \ub2e4\ub985\ub2c8\ub2e4.\n<\/p>\n<p>\nwith \uc808\uc740 \uc6d0\ub798 <a href=\"http:\/\/python.org\/peps\/pep-0340.html\">PEP-340 Anonymous Block Statements<\/a>\uc5d0\uc11c \uc18c\uac1c\ub418\uc5c8\ub358 \ubb38\ub9e5 \ucc98\ub9ac \uae30\ub2a5\ub4e4\uc744 PEP-340\uc774 \uba87\uac00\uc9c0 \ubb38\uc81c\ub85c \uc778\ud574\uc11c \uac70\ubd80\ub418\uc790 \ub300\uccb4 \ubb38\ubc95\uc73c\ub85c \ub4f1\uc7a5\ud55c \uac83\uc785\ub2c8\ub2e4. with \uc808\uc758 \ubb38\ubc95\uc740 \uc774\ub807\uc2b5\ub2c8\ub2e4.\n<\/p>\n<pre>with EXPR as VAR:\n    BLOCK<\/pre>\n<p>as VAR \ubd80\ubd84\uc740 \uc0dd\ub7b5\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \uc4f0\uba74 \ub0b4\ubd80\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \ubc88\uc5ed\uc774 \ub418\uc5b4\uc11c \uc2e4\ud589\uc774 \ub418\uac8c \ub429\ub2c8\ub2e4. (\uc18c\ubb38\uc790\ub85c \ub41c \ubcc0\uc218\ub4e4\uc740 VM \ub0b4\ubd80\uc801\uc778 \ubcc0\uc218\uc774\ubbc0\ub85c \uc18c\uc2a4\ucf54\ub4dc\uc5d0\uc11c\ub294 \uc811\uadfc \uac00\ub2a5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.)<\/p>\n<pre>ctx = (EXPR).__context__()\nexit = ctx.__exit__  # \uc544\uc9c1 \ud638\ucd9c\ud558\uc9c0\ub294 \uc54a\uc74c\nvalue = ctx.__enter__()\nexc = True\ntry:\n    try:\n        VAR = value  # \"as VAR\"\uc774 \uc788\uc744 \uacbd\uc6b0\uc5d0\ub9cc\n        BLOCK\n    except:\n        # \uc5ec\uae30\uc11c \uc608\uc678 \ucc98\ub9ac\ub97c \ud568\n        exc = False\n        exit(*sys.exc_info())\nfinally:\n    # \uc9c0\uc5ed\uc801\uc774\uc9c0 \uc54a\uc740 \ubd84\uae30\ub294 \uc5ec\uae30\uc11c \ucc98\ub9ac\ud568\n    if exc:\n        exit(None, None, None)<\/pre>\n<p>\n\ubc88\uc5ed \ubd80\ubd84\uc744 \uc57d\uac04 \uc0b4\ud3b4\ubcf4\uba74 \uc0c8\ub85c\uc6b4 \uba54\uc3d8\ub4dc \uc774\ub984\uc778 __context__, __exit__, __enter__\ub97c \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\nwith x as y: \ub77c\uace0 \uc4f0\uba74 x.__context__()\ub97c \ud638\ucd9c\ud55c \ub2e4\uc74c,<br \/>\n\uadf8 \ub140\uc11d\uc774 \ub9ac\ud134\ud55c \uac1d\uccb4\uc758 __enter__()\ub97c \ud638\ucd9c\ud574\uc11c \ub9ac\ud134\ub41c \uac83\uc744<br \/>\ny\uc5d0 \ub123\uc5b4\uc90d\ub2c8\ub2e4. \ub2e8, with\uc808\uc740 \ube14\ub7ed \uc548\uc5d0\uc11c \ud504\ub808\uc784\uc774 \uc0dd\uc131\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0<br \/>\ny\uc758 \uc720\ud6a8\uc601\uc5ed\uc740 with\uc808 \uc548\uc774 \uc544\ub2c8\ub77c, \uc678\ubd80\uc758 \uc9c0\uc5ed \ub124\uc784\uc2a4\ud398\uc774\uc2a4\uc785\ub2c8\ub2e4. (\ubc11\uc904 \ucad9~)\n<\/p>\n<p>\n\uc790.. \uacfc\uc5f0 \uc774\ub7f0\uac8c \uc5b4\ub514\uc5d0 \uc4f8\ubaa8\uac00 \uc788\uc744\uae4c! \uc0dd\uac01\ud574 \ubcf4\uba74, \ub2f9\uc7a5 \uc0dd\uac01 \ub098\ub294 \uac83\uc740 \uc784\uc2dc \ud30c\uc77c\uc744 \uc0dd\uc131\ud588\uc744 \ub54c \uadc0\ucc2e\uac8c finally\ub85c \uac10\uc2f8\uc11c \ud30c\uc77c \uc9c0\uc6cc\uc8fc\ub294 \uacbd\uc6b0\uac00 \uc0dd\uac01\ub0a9\ub2c8\ub2e4. \uadf8\ub7f0\ub370, \uc774\ub7f0 \uc0ac\uc6a9 \uc0ac\ub840\ub4e4\uc744 \uc77c\uc77c\uc774 \uc704\uc640 \uac19\uc774 __context__, __enter__\uac19\uc740 \uac83\uc744 \ub2e4 \uad6c\ud604\ud574 \uc8fc\uae30\ub294 \uad49\uc7a5\ud788 \uadc0\ucc2e\uae30 \ub54c\ubb38\uc5d0, \uc2e4\uc81c\ub85c\ub294 \uc81c\ub108\ub808\uc774\ud130\ub85c \uac04\ub2e8\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\ub3c4\ub85d contextlib\uc774\ub77c\ub294 \ubaa8\ub4c8\uc774 \uc2e0\uc124\ub418\uc5c8\uc2b5\ub2c8\ub2e4. contextlib\uc5d0\ub294 contextmanager\ub77c\ub294 \ub370\ucf54\ub808\uc774\ud130\uac00 \uc788\uc5b4\uc11c, \uc81c\ub108\ub808\uc774\ud130\ub97c \uad6c\ud604\ud560 \ub54c @contextmanager\ub97c \ud1b5\uacfc\uc2dc\ucf1c \uc8fc\uba74 \uc27d\uac8c with\uc6a9 \ucee8\ud14d\uc2a4\ud2b8\ub9e4\ub2c8\uc800\ub85c \ubcc0\uc2e0\uc744 \uc2dc\ucf1c \uc90d\ub2c8\ub2e4. closing\uc774\ub77c\ub294 \uac83\ub3c4 \uc788\uc5b4\uc11c with\ub97c \ubc97\uc5b4\ub098\uba74 \uc790\ub3d9\uc73c\ub85c \ud30c\uc77c \ub2eb\uac8c\ub3c4 \ud560 \uc218\ub3c4 \uc788\uace0\uc694~\n<\/p>\n<p>\n\ud55c \ubc88 \uc2dc\ud5d8\ud574 \ubcf4\uae30 \uc704\ud574\uc11c, \ub300\ud45c\uc801\uc778 with\uc808 \uc608\uc0c1 \uc0ac\uc6a9 \uc0ac\ub840\uc778 SQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ud2b8\ub79c\uc7ad\uc158 \ucc98\ub9ac \ubd80\ubd84\uc744 \ud55c\ubc88 \ud574 \ubd24\uc2b5\ub2c8\ub2e4. \ud83d\ude42\n<\/p>\n<pre>from __future__ import with_statement\nfrom contextlib import contextmanager\nimport MySQLdb\n\n@contextmanager\ndef mysqlconn(hostname, username, password, database):\n    conn = MySQLdb.connect(hostname, username, password, database)\n    curs = conn.cursor()\n    try:\n        curs.execute('BEGIN')\n        yield curs\n    except:\n        curs.execute('ROLLBACK')\n        raise\n    else:\n        curs.execute('COMMIT')\n    finally:\n        conn.close()\n\nwith mysqlconn('localhost', 'user', 'passwd', 'db') as curs:\n    curs.execute('select count(*) from schedule')\n    print curs.fetchone()<\/pre>\n<p>\nwith\uc808\uc5d0 \uc9c4\uc785\ud558\uba74\uc11c \uc790\ub3d9\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uc18d\uc744 \ub9fa\uc5b4\uc8fc\uba70, \uc548\uc5d0\uc11c \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uba74 \ub864\ubc31\ud558\uace0, \uc608\uc678\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uace0 \ube60\uc838\ub098\uc624\uba74 \uc790\ub3d9\uc73c\ub85c \ucee4\ubc0b\ud558\uac8c \ud574 \uc90d\ub2c8\ub2e4. \uc774\uc640 \ube44\uc2b7\ud558\uac8c threading.Queue\uac19\uc774 \uc4f0\ub808\ub4dc \uac04 \ub3d9\uae30\ud654\ub098 \uc784\uc2dc \uac1d\uccb4\uac00 \uc0dd\uc131\ub418\ub294 \uc628\uac16 \uc0ac\uc6a9\ucc98\uc5d0 \uc544\uc8fc \uc720\uc6a9\ud558\uac8c \uc4f0\uc77c \uc218 \uc788\uc744 \ub4ef \ud569\ub2c8\ub2e4~ (\uc704 \uc608\uc81c\ub97c \uc720\uc2ec\ud788 \ubcf4\uc2dc\uba74 with\uc808 \uc678\uc5d0\ub3c4 2.4\uc5d0\uc11c\ub294 \uc548 \ub418\ub358 \ubb38\ubc95\uc774 2\uac00\uc9c0 \uc228\uaca8\uc838 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ud788\ud788\ud788~)\n<\/p>\n<p>\n\uadf8\ub7f0\ub370, with\ub294 \uc0c8\ub85c\uc6b4 \ud0a4\uc6cc\ub4dc\uc774\uae30 \ub54c\ubb38\uc5d0, 2.5\uc5d0\uc11c\ub294 from __future__ import with_statement\ub97c \ud574\uc57c\uc9c0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0, 2.6\ubd80\ud130\ub294 \uc815\uaddc \ud0a4\uc6cc\ub4dc\ub85c \uc9c0\uc815\ub420 \uc608\uc815\uc785\ub2c8\ub2e4.\n<\/p>\n<p>\n\uc790, \uc774\uc81c \ud30c\uc774\uc36c\uc774 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc548 \ud574\ubcf8 \uc0ac\ub78c\ub3c4 \ud558\ub8e8\ub9cc\uc5d0 \ubc30\uc6b8 \uc218 \uc788\ub294 \uc5b8\uc5b4\ub77c\ub294 \uad74\ub808\uc5d0\uc11c \ud574\ubc29\ub418\uc5c8\uc2b5\ub2c8\ub2e4. -O-;;;;;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc774\uc81c \ud30c\uc774\uc36c\uc5d0 \uc0c8\ub85c\uc6b4 \uac83\uc774 \uacc4\uc18d \ub4e4\uc5b4\uc640\ub3c4 \ub180\ub77c\uc9c0 \uc54a\uc744 \ub9cc\ud07c, \ud30c\uc774\uc36c\uc740 \ub04a\uc784\uc5c6\uc774 \uc0c8\ub85c\uc6b4 \ubb38\ubc95\uc774 \ub9e4 \ubc84\uc804\ub9c8\ub2e4 \ub4e4\uc5b4\uc624\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ud30c\uc774\uc36c 2.3\uc5d0\uc11c generator\/bool, 2.4\uc5d0\uc11c generator expression\uc774 \ud558\uc774\ub77c\uc774\ud2b8\uc600\ub2e4\uba74, 2.5\uc5d0\uc11c\ub294 \ub2e8\uc5f0 PEP-343 with \uc808\uc774 \uac00\uc7a5 \uc8fc\uc694\ud55c \ubb38\ubc95\uc758 \ubcc0\ud654\uac00 \ub418\uaca0\uc2b5\ub2c8\ub2e4. with \uc808\uc740 \uc774\ubbf8 \ub2e4\ub978 \uc5b8\uc5b4\uc5d0 \ub9ce\uc774 \uc18c\uac1c\uac00 \ub418\uc5b4 \uc788\ub294 \uac1c\ub150\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud55c \uac83\uc778\ub370, ruby\uc758 block\uc774\ub098 \uc790\ubc14\uc758 synchronized \uac19\uc740 \uac83\ub4e4\uacfc \ube44\uc2b7\ud55c \uac1c\ub150\uc744 &#8230; <a title=\"\ud30c\uc774\uc36c 2.5 \ubbf8\ub9ac\ubcf4\uae30 1\ud3b8: with \uc808\" class=\"read-more\" href=\"https:\/\/openlook.org\/wp\/cb-1047\/\" aria-label=\"Read more about \ud30c\uc774\uc36c 2.5 \ubbf8\ub9ac\ubcf4\uae30 1\ud3b8: with \uc808\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-642","post","type-post","status-publish","format-standard","hentry","category-python"],"_links":{"self":[{"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/posts\/642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/comments?post=642"}],"version-history":[{"count":0,"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/posts\/642\/revisions"}],"wp:attachment":[{"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/media?parent=642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/categories?post=642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/openlook.org\/wp\/wp-json\/wp\/v2\/tags?post=642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}