Göz önünde bulundurulması gereken birkaç faktör:
- Kod kısa mı, hatırlanması kolay, yazması kolay ve kendini açıklayıcı mı?
- Altta yatan mantığı yeniden kullanıyor mu (yani DRY ilkesini izleyin)?
- Tam olarak aynı ayrıştırma mantığını uyguluyor mu?
Maalesef, dizeler için "%" biçimlendirmesi, stringojbect.c dosyasındaki "PyString_Format" rutininde uygulanır. Bu yordam, biçim dizesinin ayrıştırılmış biçimine erişime izin veren bir API veya kanca sağlamaz. Biçim dizgisini ayrıştırırken sonucu basitçe oluşturur. Böylece herhangi bir çözümün ayrıştırma mantığını C rutininden çoğaltması gerekecektir. Bu, DRY'nin izlenmediği anlamına gelir ve biçimlendirme belirtiminde bir değişiklik yapıldığında herhangi bir çözülme ortaya çıkarır.
PyString_Format'taki ayrıştırma algoritması, anahtar adlarda iç içe parantezlerin işlenmesi de dahil olmak üzere adil bir karmaşıklık düzeyi içerir; bu nedenle, düzenli ifadeyle tam olarak uygulanamaz veya "split()" dizesi kullanılarak gerçekleştirilemez.C kodunu PyString_Format'tan kopyalayıp Python koduna dönüştürmenin kısa bir yolu, tüm koşullarında eşleme anahtarlarının adlarını doğru bir şekilde çıkarmanın herhangi bir kolay yolunu görmüyorum.
Sonuç olarak, bir Python 2.7 "%" biçim dizesi için eşleme anahtarlarının adlarını almak için "zarif" bir yol yoktur.
import re
class StringFormattingParser(object):
__matcher = re.compile(r'(?<!%)%\(([^)]+)\)[-# +0-9.hlL]*[diouxXeEfFgGcrs]')
@classmethod
def getKeyNames(klass, formatString):
return klass.__matcher.findall(formatString)
# Demonstration of use with some sample format strings
for value in [
'%(a)s and %(b)s are friends.',
'%%(nomatch)i',
'%%',
'Another %(matched)+4.5f%d%% example',
'(%(should_match(but does not))s',
]:
print StringFormattingParser.getKeyNames(value)
# Note the following prints out "really does match"!
print '%(should_match(but does not))s' % {'should_match(but does not)': 'really does match'}
dip not:
Aşağıdaki kod en yaygın kullanımını kapsayan kısmi bir çözüm temin etmek üzere normal bir ifade kullanır DRY = Kendini Tekrar Etme (https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
Tanımladığınız yöntem iyi çalışıyor gibi görünüyor. ['A', 'b'] değerini döndürür. Peki şimdi ne eksik? –
@AdiLevin 1 numaralı yol ilave ithalat gerektirmektedir. 2 numaralı yol başka bir dize formatı gerektirir. Sadece 'string' nesnesinin iç metot ve özelliklerini veya belki de bazı string modül fonksiyonlarını kullanarak aynı sonucu elde etmenin bir yolu olduğunu merak ediyorum. – hackprime
Biçimlendirme için format() 'kullanmasını engelleyen nedir? Bu, sadece daha güçlü olduğu durumlardan biri gibi görünüyor. – Joost