μ€λ μμ
μ κ°λ₯΄μΉλ λμ pip install ipython
μ (λ₯Ό) μννκ³ if λ¬Έμ μ
λ ₯ ν λ€μ 첫 λ²μ§Έ μ€ λ€μμ Enter ν€λ₯Ό λλ₯΄κ³ μ½λκ° μ€νλμμ΅λλ€.
μ΄κ²μ λ²κ·Έμ²λΌ 보μ λλ€.
λλ pip install ipython==6.5.0
νκ³ μ½λ λΈλ‘μμ Enter ν€λ₯Ό λλ₯΄λ©΄ μ
λ ₯ ν λ€μ λ€μ¬ μ°κΈ° λ μ€μ΄ μ λλ‘ νμλμμ΅λλ€.
λλ tmux λ΄μμ ipythonμ μ€ννλ Ubuntu 18.04λ₯Ό μ¬μ©νκ³ μμ§λ§ tmuxκ° μ¬κΈ°μ λ¬Έμ μΈμ§ μμ¬ν©λλ€.
ctrl-o
λ₯Ό μ¬μ©νμ¬ μ μ€μ κ°μ ν μ μμ΅λλ€.
λλ κ·Έκ²μ κ²°μ½ μ§μνμ§ λͺ»νμ κ²μ λλ€. λλ μ΄κ²μ λ λͺ ννκ² λ§λλ λ°©λ²μ μ λͺ¨λ₯΄κ² μ§λ§ μ½κ°μ μ€λͺ / μ μ‘μ νμκ° μλ€κ³ μκ°ν©λλ€. λλ λ΄κ° μκ°ν μμλ λͺ¨λ μ§λ¦κΈΈμ μλνκ³ κ²°κ΅ λ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ€μ΄ κ·Έλ μ΄λλ₯Ό κ°μνλ€.
μ λ IPythonμ μ¬μ©νμ¬ λΌμ΄λΈ μ²μ€μ κ°λ₯΄μΉλ λμ REPLμμ μ¬λ¬ μ€ λΈλ‘μ μ½κ² μ λ ₯νκ³ νΈμ§ ν μ μμ΅λλ€. λ΄ μν©μμλ λ€λ₯Έ μ¬λλ€λ λΉμ·ν λ¬Έμ κ°μμ μ μλ€κ³ μκ°ν©λλ€.
Ctrl-Oλ₯Ό μ¬μ©νμ¬ μ¬λ¬ μ€ μ½λ λΈλ‘μ λ§λ€ μ μλ€λ κ²½κ³ κ° μ΄λκ°μμμ μ μμ΅λκΉ? μ μ ν μ₯μκ° μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€.
μ΅κ·Ό 리ν©ν°λ§μ λ²κ·Έμ λλ€. 7.xλ₯Ό μ¬μ©νλ €λ©΄ κ·Έλμ Ctrl-Oλ₯Ό μ¬μ©ν μ μλ€κ³ λ§νλ €κ³ νμ΅λλ€.
μ μ’μμ! λλ κ·Έκ²μ΄ λ¨μ§ λ²κ·Έ μλ€λ κ²μ΄ λ€νμ΄λ€. κ°μ¬ν©λλ€ @ Carreau! π
μμ μ¬νμ λν ν μ€νΈλ₯Ό μ 곡νκΈ° μν΄ μμλλ μ¬νμ λν λͺ κ°μ§ μ (μλ μ€μ΄κ³ μλνμ§ μμ)λ₯Ό μ 곡 νμκ² μ΅λκΉ?
λλ λͺ κ°μ§λ₯Ό κ°μ§κ³ μμ§λ§ λͺ κ°μ§λ₯Ό μμ§νκ³ λΉμ μκ² μν₯μ λ―ΈμΉκ³ μΆμ§ μμ΅λλ€.
with open('hello.txt', mode='wt') as my_file:
my_file.write('hi')
my_file.write('hi again')
λ λ²μ§Έ μλ₯Ό κΈ°μ΅ν μ μμ§λ§ μ¬λ¬ 루νκ° μμ΅λλ€.
numbers = [2, 1, 3, 4, 7, 8, 11]
for n in numbers:
if n > 0:
print(n*2)
else:
print(n/2)
@Carreau λ
μλ @ Deborah-Digges, λλ 빨리 보μμ§λ§ μ§κΈκΉμ§λ λ무 λ§μ§ μμμ΅λλ€.
μ΄μ input_splitterμ μλ‘μ΄ input_transformerμ μ°¨μ΄μ μ νμΈνκΈ° μν΄μ΄ μμ ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±νμ΅λλ€.
from IPython.core import inputtransformer2 as ipt2 # new way
from IPython.core import inputsplitter #oldl way
occ = inputsplitter.InputSplitter().check_complete
cc = ipt2.TransformerManager().check_complete
comp = lambda x : (cc(x), occ(x), x)
print(comp('if'))
print(comp('if\n\n'))
print(comp("""
def foo():
print('Hello')"""
))
print(comp('if True:'))
κ²°κ³Ό
(('invalid', None), ('invalid', None), 'if')
(('complete', None), ('invalid', None), 'if\n\n')
(('complete', None), ('incomplete', 4), "\ndef foo():\n print('Hello')")
(('incomplete', 4), ('incomplete', 4), 'if True:')
μΈ λ²μ§Έ νλͺ©μ΄ μ°λ¦¬μκ² κ΄μ¬μ΄μλ νλͺ©μμ μ μ μμ΅λλ€. λ λ²μ§Έλ IPythonμ "κΈ°λ₯"μ€ νλκ° 2 κ° μ΄μμ μ€ λ°κΏμ΄μλ κ²½μ° κ°μ μ€ννλ κ²μ΄λ―λ‘ νΈκΈ°μ¬μμ λ²μ΄λ¬μ΅λλ€.
κ΄λ ¨ μ½λμ μΌλΆλ shortcut.py:L109-L127μ μμ΅λλ€.
μ½λ κ²μ¬κ° "μμ νμ§"μ¬λΆλ₯Ό μ μνλ μν κ³Ό "μ€ννκ±°λ μ μ€μ μΆκ°"ν΄μΌνλμ§ μ¬λΆ μ¬μ΄μ μΌμ’ μ μΆ©λμ΄μλ κ² κ°μ΅λλ€.
λλ μ λ ₯μ΄ μ¬λ¬ μ€μΈμ§ μ¬λΆμ λ§μ§λ§ λ¬Έμκ° μ΄λ―Έ μ μ€μΈμ§ μ¬λΆλ₯Ό νμΈνλ ν΄λ¦¬μ€ν±μΌλ‘ μΆ©λΆν΄μΌνλ€κ³ _guessing_μ λλ€.
λλ¨Έμ§ μ§λ¬Έ μ€ νλλ μμ μ¬νμ μ΄λμ μ μ©ν΄μΌ νλκ°μ λλ€.
shortcut.py
? κ·Έλ λ€λ©΄ ν°λ―Έλ IPython λ§ μμ ν©λλ€.μ μ΄λ μμνκΈ°μ μΆ©λΆν μ§ μλ €μ£ΌμΈμ.
κ°μ¬ !
μλ @Carreau ! μμΈν μ€λͺ κ³Ό ν μ€νΈ μΌμ΄μ€μ κ°μ¬λ립λλ€.
λλ κ·Έκ²μ ipythonμ dev λ²μ μΌλ‘ λ‘컬μμ μ¬ν ν μ μμκ³ μ΄μ shortcut.py
λ° inputtransformer
μ½λλ₯Ό μ‘°μ¬νκΈ° μμν κ²μ
λλ€.
μμ μ¬νμ λν ν μ€νΈλ₯Ό μ 곡νκΈ° μν΄ μμλλ μ¬νμ λν λͺ κ°μ§ μ (μλ μ€μ΄κ³ μλνμ§ μμ)λ₯Ό μ 곡 νμκ² μ΅λκΉ?
λͺ κ°μ§ μκ° νμνμ§ μμ΅λλ€. λ²κ·Έλ λ§€μ° μ¬ν κ°λ₯ν λ°©μμΌλ‘ λ°μν©λλ€.
μ¬λ¬ μ€μ μ€μ΄ μ½λ‘ μΌλ‘ λλλ κ²½μ° μλ§ μλ
iPython
λλ¬Έμλ‘ λΆνλ립λλ€. μ°λ¦¬λ μ¬κ³Όμ κ΄λ ¨λ λ¬Έμ λ₯Ό μνμ§ μμ΅λλ€.
λͺ κ°μ§ μκ° νμνμ§ μμ΅λλ€.
κΈμ, λλ _need_λ μλμ§λ§ μ¬λ¬ κ°μ§ μλ₯Ό μν©λλ€. λλ μ¬ννκ³ κ·Έκ²μ κ³ μΉλ λ°©λ²μ λν μμ΄λμ΄λ₯Ό κ°μ§ μ μμ§λ§, μ¬λ¬ μΌμ΄μ€κ° μμΌλ©΄ λ΄κ° μ£μ§ μΌμ΄μ€λ₯Ό μΉμ§ μλλ‘ λμμ€λλ€. λλ IPythonμ μ¬μ©νλ λ°©λ²μ λν νΈν₯λ 견ν΄λ₯Ό κ°μ§κ³ μμΌλ―λ‘ λ€λ₯Έ μμ κ° λμμ΄λ©λλ€.
iPython
λλ¬Έμλ‘ λΆνλ립λλ€. μ°λ¦¬λ μ¬κ³Όμ κ΄λ ¨λ λ¬Έμ λ₯Ό μνμ§ μμ΅λλ€.
μ μ΄λ λλ μ λ΄κ° μ΄λ¦μ μ΄νΌκ° μλμ§ μμ λκ³ , κ°μ¬νκ³ λ―Έμν©λλ€ :)
μ¬κ³Όλ‘μ΄ (μ£Όμ) λ¬Έμ λ₯Ό ν΄κ²°νλ ν μμ² # 11354κ° μμ΅λλ€. IMHO μ΄κ²μ IPythonμ λΈλ‘νΉ λ²κ·Έμ λλ€. 곧 λ¦΄λ¦¬μ€ ν κ²μ κ³ λ €ν΄μΌν©λλ€ (μ¬μ©μκ° githubμμ μ΄μ λν΄ μμ± ν λ¬Έμ μ μ°Έμ‘°).
μ μ΄λ λλ μ λ΄κ° μ΄λ¦μ μ΄νΌκ° μλμ§ μμ λκ³ , κ°μ¬νκ³ λ―Έμν©λλ€ :)
IPython 0.1μ΄ μ²« λ²μ§Έ iProduct μ΄μ μ μΆμ λμκΈ° λλ¬Έμ (μ μΌν) μ΄μ λ μλμ§λ§ μΌλ°μ μΌλ‘ μ¬λλ€μ κΈ°μ΅ν©λλ€
μ¬κ³Όλ‘μ΄ (μ£Όμ) λ¬Έμ λ₯Ό ν΄κ²°νλ ν μμ² # 11354κ° μμ΅λλ€.
κ°μ¬ν©λλ€. μκ°μ΄λλ©΄ λ³Όκ²μ
곧 μΆμνλ κ²μ κ³ λ €ν΄μΌν©λλ€.
μ, μμ λ΄μ¬μκ° μκ°μ΄ μμΌλ©΄ κ·Έλ κ² ν κ²μ λλ€. jupyter_consoleμ μΆμμ κ°μ λ€λ₯Έ μ€μν λ¬Έμ κ° μμΌλ©° μ¬κΈ°μμλ λꡬλ $ DAYJOBμμ λͺ μκ°μ΄ 걸릴 μ μλ€κ³ μκ°νμ§ μμ΅λλ€. λ°λΌμ μ΄λ² μ£Όλ§μ κΈ°λ€λ €μΌ ν μλ μμ΅λλ€.
μ¬μ€, λ΄ μμ μΌλ‘ νκ·κ° μκ²Όμ΅λλ€. μ§κΈ κ³ μ³.
μ¬μ€, λ΄ μμ μΌλ‘ νκ·κ° μκ²Όμ΅λλ€. μ§κΈ κ³ μ³.
PR # 11354κ° μ§κΈ μ λ°μ΄νΈλμμ΅λλ€.
μμ ν΄μ£Όμ μ κ°μ¬ν©λλ€. μΈμ μΆμ λ μ§ μμλμ? λλ CTRL-Oμ vim ν€ λ°μΈλ©μ μ¬μ©νκ³ μλλ° λλ₯Ό μν΄ μλνμ§ μμ΅λλ€ (ESC + oλ ...)
μμ ν΄μ£Όμ μ κ°μ¬ν©λλ€. μΈμ μΆμ λ μ§ μμλμ?
κ·Έκ²μ νλ‘μ νΈμ μμ λ΄μ¬μ μ€ ν λͺ μ΄ λ κ²μ λλ€. 7.1μ λν λͺ κ°μ§ λ¨μ λ¬Έμ λ₯Ό λΆλ₯νκ³ λ¦΄λ¦¬μ€λ₯Ό μννλ λ° λͺ μκ°μ λ¬΄λ£ μκ°μ΄ μ£Όμ΄μ§λλ€. μ΄λ² μ£Όλ§μ λͺ μκ°μ 보λ΄κ³ μΆμ§λ§ κ·Έκ²λ§μΌλ‘λ μΆ©λΆνμ§ μμ μ μμ΅λλ€.
κΈ°μ‘΄ PR / λ¬Έμ λ₯Ό λΆλ₯ / κ²ν / νκ·Ένλ λ° λμμ΄ λ κ²μ λλ€.
async with
λΈλ‘μΌλ‘ μ¬μ ν μ¬ν κ°λ₯νλ©° νμ¬ λ§μ€ν° λΈλμΉμ PyPIμ v7.1.1μ λͺ¨λ μλνμ΅λλ€.
In [16]: async with aiofiles.open('/tmp/foobar', 'r') as f:
...: content = await f.read()
In [17]: content
Out[17]: 'hello'
ν , autoawaitμμ μ΄μν μνΈ μμ© μΌ μ μμ΅λλ€.
μ,μ΄ λ¬Έμ μ κ΄λ ¨μ΄ μμ κ² κ°λ€μ. μ΄μ¨λ μ€ν¨ν μ΄μ λ
async with aiohttp.ClientSession() as session:
pass| # < cursor is there
κ° μ€ λμμ check_complete
μ€ννκ³ , μ°¨λ‘λ‘ compile_command
λ₯Ό μ€ννκ³ , νμλ 'async with'κ° λΉλκΈ° ν¨μ μΈλΆμμ μ¬μ©λκΈ° λλ¬Έμ SyntaxError
μν΅λλ€. .
λ΄ ν¬ν¬μμ λ°©κΈ SyntaxError
μμκ±°νμ§λ§ νμ€ν κ³ μΉλ κ°μ₯ λ°μ λ°©λ²μ μλλλ€.
κ°λ₯ν μ루μ / μμ΄λμ΄ :
autoawait
κ° μΌμ Έ μλμ§ νμΈν΄μΌν©λλ€. κ·Έλ λ€λ©΄ νΉμ SyntaxError
μΌμ΄μ€λ₯Ό 무μν μ μμ΅λλ€. λλ κ·Έκ²μ΄ μ’μ ν΄κ²°μ±
μ΄λΌκ³ μκ°νμ§ μμ§λ§ μ΄μ©λ©΄ λλ μΌμ μ§λμΉκ² 볡μ‘νκ² λ§λ€κ³ μμ μλμλ€.
autoawaitκ° μλ€λ©΄, κ³΅κΈ compile_command()
μ μΈμ μ½λ _asyncify()
. λλ μ΄λ° μμΌλ‘ SyntaxError
μΈμνμ§ μμ κ²μ΄λΌκ³ μκ°νμ§λ§ _asyncify()
μμ²΄κ° μ½κ°μ λ€μ¬ μ°κΈ°λ₯Ό μΆκ°νκ³ μ½κ² μ§μ λΆν΄μ§ μ μκΈ° λλ¬Έμ μ€ λ°κΏ λ¬Έμ κ° ν΄κ²° λ μ§ νμ€νμ§ μμ΅λλ€.
_AsyncSyntaxErrorVisitor
κ° λμμ΄ λ κΉμ? νμ§λ§ κ·Έ λ°λ μΈ κ² κ°μμ
νμ μ΄ λΆμ‘±ν΄μ μ κ°μ λλ€. PRμ μ μΆνκ³ μΆμ§λ§ ν μ€νΈ μμ±μ΄ μ«κ³ λ¬Έμ λ₯Ό ν΄κ²°νλ λ μ’μ λ°©λ²λ λͺ¨λ₯΄κ² μ΅λλ€. κ·Έλ¬λ λκ΅°κ°μκ² μ¬μ ν μ μ©νκΈ°λ₯Ό λ°λλλ€.
μ°λ¦¬λ κ°μ κ²μ μλ ν μ μ΄ λΏλ§ μλλΌ.
κ·Έκ²μ΄ λΉμ μ μμ nΒΊ 2μ΄κ³ , μ λ§ μΆν©λλ€. κ°νμ΄ μλν©λλ€. μ’μ μ μ CPythonμμ μ μ ν μ§μμλ°λ κ²μ λλ€.
μ΄ λ¬Έμ κ° μ¬μ ν ν΄κ²°λμ§ μμμ΅λκΉ? μ΄ λ²κ·Έλ₯Ό μ‘μ κ² κ°μ΅λλ€ ...
μ΄κ²μ μ€λ μ²μμΌλ‘ λμμ΅λλ€ (νμ΄μ¬μμ μμ±κΈ°κ° 무μμΈμ§ λ³΄μ¬ μ£Όλ €κ³ ν λ ν΄λΌμ΄μΈνΈμ ν¨κ» λ°λͺ¨λ₯Όνλ λμ !!!).
λ΄κ° λκ° μλͺ»νκ±°λ μ¬λ¬ μ€ μ½λ λΈλ‘μ μμ±νκΈ° μν΄ λ¬΄μμν΄μΌν©λκΉ (CTRL-o ν΄κ²° λ°©λ² μ μΈ)?
νμ€ Python REPLμ νμλ μμ κ²°κ³Ό :
(tsa) BillsMacBookPro:develop billtubbs$ python
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(5):
... x = i*2
... print(x)
...
0
2
4
6
8
>>> exit()
μ€λ iPython REPLμ λμΌν λ΄μ©μ μ λ ₯νλ©΄ κ²°κ³Ό :
(tsa) BillsMacBookPro:develop billtubbs$ ipython
Python 3.5.5 | packaged by conda-forge | (default, Jul 23 2018, 23:45:11)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: for i in range(5):
...: x = i*2
In [2]:
iPython REPLμ μμλλ‘ λ λ²μ§Έ μ€μ μλμΌλ‘ λ€μ¬ μλλ€. κ·Έλ¬λ λ λ²μ§Έ μ€ λμ enterλ₯Ό μ λ ₯νλ©΄ μ νμ μΈ μΈ λ²μ§Έ μ€μ μ 곡νλ λμ λ μ€μ μ€νν©λλ€.
μμμ μ€λͺ ν κ²μ²λΌ λ λ²μ§Έ μ€μμ Enter ν€λ₯Ό λλ₯΄λ λμ CTRL-oλ₯Ό λλ¬ μνλ κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€.
In [2]: for i in range(5):
...: x = i*2
...: print(x)
0
2
4
6
8
IPython 7.0.1-...
IPythonμ μ κ·Έλ μ΄λνμΈμ.μ΄ λ¬Έμ λ ν΄κ²°λμμ΅λλ€. μ¬μ ν λΉλκΈ° μ½λκ°μλ κ²½μ°κ° μμ΅λλ€.
μ μ£μ‘ν©λλ€. λλ κ·Έλ κ² μκ°νλ€. ν conda update ipython
I GET # All requested packages already installed.
μ£μ‘ν©λλ€. μ’ ν·κ°λ¦¬λ€μ. μ΅μ λ²μ μ 무μμ΄λ©° μ΄λ»κ² μ κ·Έλ μ΄λν©λκΉ?
μ€μΉ λ°©λ²μ λ°λΌ λ€λ₯΄λ―λ‘ pip install
λ‘ μλνμ¬ μλνλμ§ νμΈνλ κ²μ΄ μ’μ΅λλ€. κ·Έλ¬λ νκ²½μμ μμ
ν μλ μμ΅λλ€.
κ·Έλ° μΌμ΄ λ°μνλ©΄ IPythonμ μμν μ μμ λκΉμ§ μ κ·Ήμ μΌλ‘ μ κ±°ν λ€μ λ€μ μ€μΉν©λλ€.
κ°μ₯ μ μ©ν λκΈ
PR # 11354κ° μ§κΈ μ λ°μ΄νΈλμμ΅λλ€.