1

一般的に、私はモジュールのプライバシーを尊重するように努めています(変数の前にアンダースコアが付いている場合は、使用しません)。ただし、かなり「安全」と思われるコーナーケースがあります。

これがデモです(私の前の質問

parser=argparse.ArgumentParser()
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)')
parser.parse_args('--point=-2,5,6'.split())  #works
parser.parse_args('--point -2,5,6'.split())  #doesn't work

これは次の方法で修正できます。

parser=argparse.ArgumentParser()
parser.add_argument('--point',help='enter a point (e.g. 2,3,4)')
parser.parse_args('--point=-2,5,6'.split())  #works
parser._negative_number_matcher = re.compile(r'^-\d+|^-\d*\.\d+')
#Next line works too on Cpython 2.6, 
#got the idea from reading Cpython 3.2 source so it should work there too
parser.parse_args('--point -2,5,6'.split())  

この場合、クラスの内部でこの量の遊びをするのは問題ないようです。理由は次のとおりです。

* argparseがその変数を変更した場合(ありそうもない)、または別のpython実装が異なる方法で変更した場合、これがクラスの動作を変更して何かを壊す可能性は非常に低いようです。

*他のPython実装では、純粋なPythonで記述されているため(私が知る限り)、cpythonのargparseを使用する可能性があります。

*私のコードは、この「機能」の動作に大きく依存していません。(ユーザーはいつでも「-point = -2,5,6」の受け渡しに戻ることができます)

私の質問はこれです:私は何かが足りないのですか?これは本当に悪い考えですか?私は何かを壊す可能性がありますか?もしそうなら、なぜですか?

4

1 に答える 1

3

それは悪い考えだと思います。それは、argparseの内部で何かを壊す可能性があるからではなく、単に間違っているからです。^-\d+は負の数の有効な正規表現ではありません(一致するため-23foo)。また、コードに明らかに間違ったものがあると、メンテナンスに適していません。^-\d+2年後、このコードをじっと見つめ、負の数とどのように一致するかについて困惑している自分(またはさらに悪いことに他の誰か)を想像してみてください!

于 2012-06-14T14:02:43.723 に答える