2015-04-07 21 views
13

Yeni anahtar kelimeler tanımlamanın mümkün olup olmadığını ya da Python'daki Ruby, çıplak sözcükleri tartışırken WAT's Destroy All Software talk olarak adlandırılanları görmek istedim.Çıplak sözcükler/Python'da yeni anahtar kelimeler

Başka yerde bulamadığım bir cevapla geldim, bu yüzden Q & StackOverflow stilini paylaşmaya karar verdim.

+1

Niçin aşağı çekme/oy kullanma nedenlerini açıklamak ister? Python'da, tercümanın kaynak kodunu gerçekten değiştirmeye ve yeniden derlemeye gerek kalmadan yeni anahtar kelimeler eklemek isteyen herkes için yararlı olabilecek bilgileri paylaşıyorum. Bu yanlış kullanılabilir mi? Neredeyse kesinlikle olacak. Ama gerçekten bunu yapmak istiyorsan, bunu senin için burada sağladım. Ve eğer bunu yapmak istemiyorsan, o zaman sadece hareket et - küçültme ya da kapanmaya oy verme gereği yok. – ArtOfWarfare

+3

Bunun için ilginç bir kullanım durumu, giriş() olmadan etkileşimli bir komut satırı arabirimi uygulanıyor olabilir. Böylelikle, interaktif bir kabuğun ve bir yandan aynı anda tam bir güce sahip olursunuz. Bu bir anti-desen, ama ilginç. – RobotHumans

+4

Eğrinin çok ötesindesiniz: bu yüzden ... **; -) ** Para kazanacağınız bir tablet icat ederek değil, onu rafine ederek ve yapacağınız bir iPad olarak adlandırın. yukarı-oy (ki bu 5 oyu engelleyecektir) **>: -) ** – Fabby

cevap

12

Bunu sadece REPL içinde, şu ana kadar herhangi bir bloğun dışında denedim. Başka yerlerde de çalışmak mümkün olabilir.

benim piton başlangıç ​​dosyasında bu koyun:

def bareWordHandler(type_, value, traceback_): 
    if isinstance(value, SyntaxError): 
     import traceback 

     # You can probably modify this next line so that it'll work within blocks, as well as outside them: 
     bareWords = traceback.format_exception(type_, value, traceback_)[1].split() 

     # At this point we have the raw string that was entered. 
     # Use whatever logic you want on it to decide what to do. 
     if bareWords[0] == 'Awesome': 
      print(' '.join(bareWords[1:]).upper() + '!') 
      return 
    bareWordsHandler.originalExceptHookFunction(type_, value, traceback_) 

import sys 
bareWordsHandler.originalExceptHookFunction = sys.excepthook 
sys.excepthook = bareWordsHandler 

Hızlı REPL oturumu gösteri afterwords: sorumlu

>>> Awesome bare words 
BARE WORDS! 

kullanın.

Düzenleme: İşte daha kullanışlı bir örnek. run anahtar kelimeye ekledim.

if bareWords[0] == 'from' and bareWords[2] == 'run': 
     atPrompt.autoRun = ['from ' + bareWords[1] + ' import ' + bareWords[3].split('(')[0], 
          ' '.join(bareWords[3:])] 
     return 

atPrompt.autoRun, benim istemi görüntülendiğinde, otomatik olarak kontrol edilmeli ve geri beslenen olacak değişkenlerin listesidir.

>>> from loadBalanceTester run loadBalancerTest(runJar = False) 

Ve bu şekilde yorumlanır alır: Yani, örneğin, bunu yapabilirim

from loadBalancerTest import loadBalancerTest 
loadBalancerTest(runJar = False) 

It tür bir makro gibi - bana bu tür şeyleri yapmak istiyorum için daha yaygın, Bu yüzden daha az tuşa basmamı sağlayan bir anahtar kelime eklemeye karar verdim.

+1

Bu .... korkunç o_O – Shayne

+0

@Shayne Bence bu tür şeyler yeni dillerin doğduğu yerlerdir. Mevcut dillerdeki kötü çirkin şeyleri yaparsınız, en sonunda kendi yeni resmi diline dönmeye karar verene kadar. IE, C++ 'nun OO tasarımını daha kolay hale getirmesi için bir grup makro olarak hayata başladığını duydum. – ArtOfWarfare

+4

Bu benim en sevdiğim SO cevabı. Bu, * başka türlü duyarlı ve sözdizimsel bir dilin kötüye kullanılması, +1 – cat

İlgili konular