형식 문자열 사전 계단식/재귀 적 문자열 보간을 수행하고 싶습니다. 파이썬에서 계단식 문자열 보간
FOLDERS = dict(home="/home/user",
workspace="{home}/workspace",
app_project="{workspace}/{app_name}",
app_name="my_app")
나는이 구현 시작 :
def interpolate(attrs):
remain = [k for k, v in attrs.items() if "{" in v]
while remain:
for k in remain:
attrs[k] = attrs[k].format(**attrs)
remain = [k for k in remain if "{" in attrs[k]]
interpolate()
함수는 먼저 형식 문자열을 선택합니다. 그런 다음 형식 문자열이 더 이상 남아 있지 않을 때까지 문자열을 대체합니다. 나는 다음과 같은 파이썬 사전이 함수를 호출 할 때
, 내가 얻을 :
>>> import pprint
>>> pprint.pprint(FOLDERS)
{'app_name': 'my_app',
'app_project': '/home/user/workspace/my_app',
'home': '/home/user',
'workspace': '/home/user/workspace'}
결과는 OK입니다 만, 그러한 구현은 참조주기를 감지하지 않습니다.
예를 들어 다음 호출을하면 무한 루프가 발생합니다.
>>> interpolate({'home': '{home}'})
아무에게도 더 나은 구현을 제공 할 수 있습니까?
편집 : 솔루션
나는 레온의 솔루션은 너무 서지 Bellesta의 하나 좋은 간단하다 생각합니다.
def interpolate(attrs):
remain = [k for k, v in attrs.items() if "{" in v]
while remain:
for k in remain:
attrs[k] = attrs[k].format(**attrs)
fmt = '{' + k + '}'
if fmt in attrs[k]: # check for reference cycles
raise ValueError("Reference cycle found for '{k}'!".format(k=k))
remain = [k for k in remain if "{" in attrs[k]]
*? "누군가가 나에게 더욱 향상된 기능을 제공 할 수"* - 그건 SO가있는 것이 아닙니다. 해결하려는 실제 문제는 무엇입니까 - 참조주기가있는 입력을 실제로 얻을 수 있습니까? – jonrsharpe
* "더 나은 구현을 제공 할 수 있습니까?"* - 주어진 입력에 대해 정확히 동일한 결과를 생성해야합니까? –
사실, 나는 일반적인 해결책을 찾고있다. 예시는 설명을위한 것입니다. 예, 폴더를 정의하는 사용자가 일반적으로 구성 파일 (예 :''interpolate()''함수에서 오류를 만드는 경우주기를 가질 수 있습니다. –