15

これは、助けを求めるというよりも、私が理解しようとしているPythonモジュールで遭遇した「興味深い」現象です(ただし、解決策も役立ちます)。

>>> import fuzzy
>>> s = fuzzy.Soundex(4)
>>> a = "apple"
>>> b = a
>>> sdx_a = s(a)
>>> sdx_a
'A140'
>>> a
'APPLE'
>>> b
'APPLE'

そうです、ファジーモジュールはPythonの文字列の不変性に完全に違反しています。Cエクステンションなのでこれはできますか?そして、これはCPythonとモジュールのエラー、またはセキュリティリスクを構成しますか?

また、誰かがこの行動を回避する方法を考えることができますか?文字列の元の大文字を維持できるようにしたいと思います。

乾杯、

アレックス

4

4 に答える 4

13

このバグは2月に解決されました。バージョンを更新します。

あなたの質問に答えるために、はい、Cレベルで不変型を変更するいくつかの方法があります。現時点では、セキュリティへの影響は不明であり、場合によっては不明ですらあります。

于 2012-04-30T03:58:02.553 に答える
2

現在テストできるモジュールはありませんfuzzyが、次のように新しいIDで文字列を作成します。

>>> a = "hello"
>>> b = ''.join(a)
>>> b
'hello'
>>> id(a), id(b)
(182894286096, 182894559280)
于 2012-04-30T03:18:28.113 に答える
2

CPythonについてはよくわかりませんが、CPythonfuzzy.cで宣言されているように見えます。char *cs = sここで、sはへの入力__call__です。次にcs[i]、を変更します。これにより、明らかに変更されs[i]、元の文字列が変更されます。これは間違いなくFuzzyのバグであり、bitbucketにファイルする必要があります。グレッグの答えが言ったように、を使用''.join(a)すると新しいコピーが作成されます。

于 2012-04-30T03:50:03.537 に答える
0

不変の文字列を変更する場合、それはバグです。次の方法でこれを回避できます。

s(a.upper())
于 2012-04-30T03:49:36.653 に答える