第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將變量評估為 Python f 字符串

如何將變量評估為 Python f 字符串

qq_笑_17 2021-11-09 16:22:43
我想要一種評估 f 字符串的機制,其中要評估的內容在變量中提供。例如,x=7s='{x+x}'fstr_eval(s)對于我想到的用例,字符串s可能來自用戶輸入(用戶信任的地方eval)。雖然eval在生產中使用通常是非常糟糕的做法,但也有明顯的例外。例如,用戶可能是在本地機器上工作的 Python 開發(fā)人員,他希望使用完整的 Python 語法來開發(fā) SQL 查詢。關于重復的注意事項:這里和這里有類似的問題。第一個問題是在模板的有限上下文中提出的。第二個問題雖然與這個問題非常相似,但已被標記為重復。因為這個問題的上下文與第一個問題有很大不同,我決定根據第二個問題之后自動生成的建議提出第三個問題:這個問題以前有人問過,已經有了答案。如果這些答案不能完全解決您的問題,請?zhí)岢鲆粋€新問題。
查看完整描述

2 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

即使有值得信賴的用戶,使用也eval應該只是最后的手段。


如果您愿意犧牲語法的靈活性以獲得更多的安全性和控制,那么您可以使用str.format并提供它的整個范圍。


這將不允許對表達式求值,但單個變量將被格式化到輸出中。


代碼

x = 3

y = 'foo'


s = input('> ')

print(s.format(**vars()))

例子

> {x} and {y}

3 and foo


查看完整回答
反對 回復 2021-11-09
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

這是我對 f-strings 進行更可靠評估的嘗試,靈感來自kadee對類似問題的優(yōu)雅回答。


但是,我想避免該eval方法的一些基本陷阱。例如,eval(f"f'{template}'")只要模板包含一個撇號就會失敗,例如the string's evaluation成為f'the string's evaluation'它以語法錯誤評估。第一個改進是使用三撇號:


eval(f"f'''{template}'''")

現在在模板中使用撇號(大部分)是安全的,只要它們不是三重撇號。(三引號也可以。)一個值得注意的例外是字符串末尾的撇號:whatcha doin'變成f'''whatcha doin''''在第四個連續(xù)撇號處計算語法錯誤。以下代碼通過去除字符串末尾的撇號并在計算后將它們放回去來避免此特定問題。


import builtins


def fstr_eval(_s: str, raw_string=False, eval=builtins.eval):

    r"""str: Evaluate a string as an f-string literal.


    Args:

       _s (str): The string to evaluate.

       raw_string (bool, optional): Evaluate as a raw literal 

           (don't escape \). Defaults to False.

       eval (callable, optional): Evaluation function. Defaults

           to Python's builtin eval.


    Raises:

        ValueError: Triple-apostrophes ''' are forbidden.

    """

    # Prefix all local variables with _ to reduce collisions in case

    # eval is called in the local namespace.

    _TA = "'''" # triple-apostrophes constant, for readability

    if _TA in _s:

        raise ValueError("Triple-apostrophes ''' are forbidden. " + \

                         'Consider using """ instead.')


    # Strip apostrophes from the end of _s and store them in _ra.

    # There are at most two since triple-apostrophes are forbidden.

    if _s.endswith("''"):

        _ra = "''"

        _s = _s[:-2]

    elif _s.endswith("'"):

        _ra = "'"

        _s = _s[:-1]

    else:

        _ra = ""

    # Now the last character of s (if it exists) is guaranteed

    # not to be an apostrophe.


    _prefix = 'rf' if raw_string else 'f'

    return eval(_prefix + _TA + _s + _TA) + _ra

在不指定評估函數的情況下,該函數的局部變量是可訪問的,因此


print(fstr_eval(r"raw_string: {raw_string}\neval: {eval}\n_s: {_s}"))

印刷


raw_string: False

eval: <built-in function eval>

_s: raw_string: {raw_string}\neval: {eval}\n_s: {_s}

雖然前綴_降低了意外碰撞的可能性,但可以通過傳遞適當的評估函數來避免該問題。例如,可以通過以下方式傳遞當前的全局命名空間lambda:


fstr_eval('{_s}', eval=lambda expr: eval(expr))#NameError: name '_s' is not defined

或更一般地,通過將合適的globals和locals參數傳遞給eval,例如


fstr_eval('{x+x}', eval=lambda expr: eval(expr, {}, {'x': 7})) # 14

我還包含了一種機制,\可以通過“原始字符串文字”機制選擇是否應將其視為轉義字符。例如,


print(fstr_eval(r'x\ny'))

產量


x

y

盡管


print(fstr_eval(r'x\ny', raw_string=True))

產量


x\ny

可能還有其他我沒有注意到的陷阱,但出于許多目的,我認為這已經足夠了。


查看完整回答
反對 回復 2021-11-09
  • 2 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號