2016-04-08 12 views
0

Bir python etkileşimli oturumundan, ifadenin içinde bir REPL döngüsünün girilmesinin bir yolu var mı?Python etkileşimli REPL bir ifadenin içinde

Normalde ifadesiyle bir tek blokta ben bağlamda, interaktif oturumda kod çalıştırmasına edebilmek istiyorum

>>> 
>>> with app.app_context(): 
>>> ... # Normally this is executed as a single block, all at once 

olarak yürütülür.

>>> 
>>> with app.app_context(): 
>>> # do stuff here in a REPL loop 
+0

Yineleme döngüsü ile ne demek istiyorsunuz? –

+0

Bu, etkileşimli olarak geçici olarak açmak istediğiniz bir komut dosyasında mı, yoksa etkileşimli olarak, önce "ile" bloğunu tamamlamanıza gerek kalmadan etkileşimli olarak "etkileşimli" olarak çalıştırmak istediğiniz etkileşimli bir oturumdasınız mı? – user2357112

+0

@PadraicCunningham REPL = Okuma Eval Yazdırma Döngüsü https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop – 00500005

cevap

2

with deyimini tam olarak taklit edemezsiniz, ama muhtemelen app.app_context().__enter__() numaralı telefonu arayarak yaklaşabilirsiniz.

Bu bir istisna varsa otomatik olarak __exit__ olmaz, aksi halde aynı şekilde çalışması gerekir (işiniz bittiğinde kendiniz __exit__ numaralı telefonu aramanız gerekebilir, tam olarak bu bağlam yöneticisinin ne yaptığından emin değilim).

+0

sorusunun bağlamını açıklığa kavuşturdu. Bir içerik yöneticisi, herhangi bir çıkış koşulu için '__exit__' öğesini çağırır ve istisnaları kurtarma veya değiştirme gibi şeyleri yapabilir. Ama benim amaçlarım için, bu o kadar yararlı değil – 00500005

+0

Evet, bu yüzden '__exit__' kendiniz çağırmadan bahsetmiştim. Ancak, 'app_context' içerik yöneticisinin ne yaptığına bağlı olarak ('__exit__' yöntemi çok az veya hiç yapamaz) önemli olmayabilir. – Blckknght

0

bir Python 2.7 bir contextmanager ile çok basit girdiler (yani hiçbir değişken bildirimleri) için REPL tam işleyen:

from contextlib import contextmanager 
import sys 
class app(object): 
    @contextmanager 
    def app_context(self): 
     sys.stdout.write(">>> ") 
     yield raw_input() 

with app().app_context() as output: 
    while True: 
     print eval(output) 
     output = app().app_context().__enter__() 

Bu şey daha sofistike işlemek için bazı işler gerekir - eval olduğunu bir göze batan şey, ve^C kısa devre kırmak için iyi bir yol yok - ama işe yaramalı.

İlgili konular