変数名にUnicode文字を使用するのは悪いですか?[閉まっている]


82

私は最近、ランキングアルゴリズムであるAllegSkillをPython 3に実装しようとしました。

数学は次のようになります。

代替テキスト

いいえ、本当に。

これは私が書いたものです:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

実際、Python 3が変数名を受け入れない、または²変数名として受け入れないのは残念だと思いました。

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

私は頭がおかしいですか?ASCIIのみのバージョンに頼るべきですか?どうして?上記のASCIIのみのバージョンは、式との等価性を検証するのが難しくありませんか?

気を付けてください、いくつかのUnicodeグリフは互いに非常によく似ており、or(またはそれは▗▖)やwrittenは書かれたコードではまったく意味をなさないものに似ていることを理解しています。ただし、数学や矢印グリフの場合はほとんどそうではありません。


リクエストごとに、ASCIIのみのバージョンは次のようなものになります。

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

...アルゴリズムの各ステップごと。


58
それはとてつもなく、まったく読めず、言いようのないほどクールです。
ドミニクマクドネル

2
ユニコードについて話す... codinghorror.com/blog/2008/03/i-entity-unicode.html
CoderHawk

3
Pythonが変数として算術演算を受け入れないことは非常に良いことです。平方根記号は、平方根を取る操作を示す必要があり、変数であってはなりません。
デビッドソーン

4
@ David、Pythonにはそのような区別はありません。実際、関数(より正確には、呼び出し可能)を sqrt = lambda x: x**.5取得します。sqrt(2) => 1.41421356237
badp

4
OutputStream.🚽;

回答:


54

私は、単に置き換えσられるsか、またはsigma愚かであり、脳死に隣接していると強く感じています。

潜在的な利益は何ですか?さて、見てみましょう…

  • 可読性が向上しますか?いや、ほんのわずかではありません。もしそうなら、元の式は間違いなくラテン文字も使用していたでしょう。

  • 書き込み可能性が向上しますか?一見、はい。しかし、二番目に、いや。この式は決して変わらないからです(まあ、「決して」はありません)。通常、コードを変更したり、これらの変数を使用してコードを拡張したりする必要はありません。したがって、書き込み可能性は-これは一度だけ-問題ではありません。

個人的には、プログラミング言語には数式よりも優れている点があると思います。意味のある表現力豊かな識別子を使用できます。数学では、通常これは当てはまらないため、1文字の変数に頼り、ときどきギリシャ語にします。

しかし、ギリシャ語は問題ではありません。説明のない1文字の識別子です。

そのため、プログラミング言語識別子でUnicodeをサポートしている場合、結局、元の表記を維持するか、技術的な障壁はありません。または意味のある識別子を使用します。ギリシャ語のグリフをラテン語のグリフに置き換えるだけではありません。またはアラビア語、またはヒンディー語のもの。


3
プログラミング言語が使用をサポートしている場合でも、一部のツールはUnicode文字を読み取ることができません。非ユニコード変数名を使用することは頭の痛い決定とは呼ばないでしょう。これは、投稿から2.5年が経過した後も変わりません。
ゲイリーS.ウィーバー

44
@Gary「一部のツールはUnicodeを読み取れません」–ツールを変更すると、それらはくだらないことになります。申し訳ありませんが、2013年です。私は同情がなく、そのようなツールに対する忍耐力さえありません。欠陥のあるツールに絶えず対応することは、進歩を妨げます。
コンラッドルドルフ

3
@KonradRudolph私のポイントは、いくつかのツールは何らかの理由でUnicodeをサポートしておらず、サポートできないため、「ツールを変更する」ことは必ずしも正しい答えではないということです。ユニコードは優れており、ツールはそれを理解する必要があることに同意しますが、それは必ずしもオプションではありません。

3
@John私は、「ツールを変更する」ことが適切な答えだと主張しています。特にあなたの例はそのような場合を示してい.propertiesます:Java ファイルは簡単に解析できます。.propertiesUnicodeをサポートしていないファイルに裏打ちされたツールチェーンを実際に使用したことがある場合、そのツールチェーンを削除することは完全に合理的です(そして、それを自分で交換するか、代替手段を見つけるか、最悪の場合は委託します) )。もちろん、これはレガシーシステムには適用されません。ただし、レガシーシステムの場合、ベストプラクティスに関する考慮事項は適用されません。
コンラッドルドルフ14年

8
あなたが話すこれらの「交換」問題は、主にJavaとWindows開発者の問題のようです。Linuxの世界のほとんどは、10年以上前にUTF-8で標準化されました。これは間違いなくツールチェーンの問題です。悪いツールの使用をやめてください。
リッチリマー14年

33

個人的には、文字マップを表示して再度入力する必要があるコードを見るのは嫌です。ユニコードはアルゴリズムの内容とほぼ一致していますが、実際には読みやすさと編集能力を損ないます。一部のエディターには、その文字をサポートするフォントさえない場合があります。

代替案についてはどうですか?単にトップを//µ = u持ち、すべてをアスキーで書きますか?


14
ところで、すべてのキーボードが標準のコーディングキーを快適に公開するとは限りません。私のキーボードレイアウトが必要と3入力したキーを{して}(ところでttysのに失敗している)と完全に欠けている`~私はカスタムキーマップを使用していなかった場合はどのように任意のbashスクリプトは、文字マップを使用するために私を必要としないではないでしょうか...?:)
badp

4
ギリシャ語のキーボードをネイティブのキーボードと一緒にインストールし、1回のキーストロークでそれらを切り替えることができます。これは、IM / emailで数学について話すときに便利です...そして、私はすでにPythonスクリプトで数学を使用することを考えました。
リオリ

18
あー ギリシャ文字を単純な文字に置き換えるだけですか?まったく得られません。意味のある変数名を使用するか、論文の名前を使用してください。創造的である理由はありません。
コンラッドルドルフ

12
単に

4
合理的なエディターには、このようなコードを簡単に編集できる、Unicodeの適切な入力メソッドがあります。たとえば、Emacsは(特に)TeXおよびをサポートしていrfc1345ます。TeXまさにそのように聞こえます。\sigmafor σおよび\tofor と入力できます。for やfor rfc1345などの組み合わせを提供します。経験則として、Emacsよりも性能の低いエディターを使用してプログラマーを受け入れる心配はありません。&s*σ&->
ティコンジャービス

31

この引数は、ユニコードの入力やギリシャ文字の読み取りに問題がないことを前提としています

引数は次のとおりです。piまたはcircular_ratioが必要ですか?

この場合、私は小学生の頃からpiについて学んだため、circular_ratioよりもpiの方が好きです。したがって、circular_ratioを意味するためにπを入力してもかまいません。

しかし、どうですか

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

または

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

私にとって、両方のバージョンは、私が小学校でこの式を学ばなかったことを除いて、同じようにpiまたは同じように不透明です。そして私に、またはコードを読んで、誰に何を意味する、とどちらも使用していないことはどんな良いことがありません。πwinner_sigmaWwinσw

だから、例えばわかりやすい名前を使用してtotal_scorewinning_ratioなどを使用するよりもはるかに優れた可読性増加するだけでギリシャ文字を発音ASCII名を。問題は、ギリシャ文字が読めないということではありませんが、文字(ギリシャ語かどうか)を変数の「意味」と関連付けることができません。

あなたがコメントしたとき、あなたは確かにあなた自身で問題を理解しました:You should have seen the paper. It's just eight pages...。問題は、読みやすさよりも簡潔さのために(ギリシャ語であるかどうかに関係なく)1文字の名前を選択する論文に基づいて変数の命名を行う場合、人々は手紙を関連付けるために論文を読む必要があります"意味"; これは、人々があなたのコードを理解できるように人為的な障壁を設けていることを意味し、それは常に悪いことです。

ASCIIのみの世界に住んでいる場合でも、両方ともa * b / 2alpha * beta / 2height * base / 2、三角形領域の式であるの不透明なレンダリングです。式の複雑さが増すにつれて、1文字の変数を使用することの読み難さが指数関数的に増大し、AllegSkill式は確かに些細な式ではありません。

1文字の変数は、ギリシャ語の1文字でもASCIIの1文字でも、単純なループカウンターとしてのみ受け入れられます。他の変数が1文字だけで構成されてはなりません。名前にギリシャ文字を使用しても構いませんが、使用する場合は、他の場所で任意の論文を読む必要なく、それらの名前を「意味」に関連付けられるようにしてください。

小学校では、基本的な算術に+、-、×、÷などの記号を使用した数式が表示されるのを絶対に気にしません。√()は平方根関数になります。私が小学校を卒業した後、私は光沢のある新しいシンボルの追加を気にしません:統合のために∫。傾向に注意してください、これらはすべて演算子です。演算子は変数名よりもはるかに頻繁に使用されますが、まったく異なる意味で再利用されることはあまりありません(数学者が演算子を再利用する場合、新しい意味は古い意味の基本的な特性を保持することがよくありますが、そうではありません変数名を再利用する場合)。

結論として、いや、変数名にUnicode文字を使用することは悪くありません。ただし、変数名に1文字の名前を使用することは常に悪いことであり、Unicode名の使用を許可することは、1文字の変数名を使用するライセンスではありません。


9
正直に言うと、ここの式はのerror_on_measured_skill_with_99th_percent_confidence代わりに使用したとしても、あまり意味がありませんsigma
badp

4
@badp:長い名前!=良い名前。それにもかかわらず、良い名前を選択することができない場合があります(たとえば、式を理解するだけで、式の各部分が何をするかを完全に理解しない場合(完全に異なるレベルの理解が必要))、その場合、2番目に良い方法は、お尻をいくつかのコメントで隠すことです(外部の論文に送信するよりも良い)。例えば、変数名が参照について説明し、データ・ディクショナリの追加// σw = skill level measurement errorなど、
ライアンうそ

1
@badp:正直に言うと、その情報だけでは、シグマはファッジファクター(いわば)を指しているので、シグマが私に印象を与えるよりも、式の理解が少し良くなります。そもそも数式が理解しにくい場合、その上に不透明度を追加したくありません。
ライライアン

2
はい。この。残念ながら、答えを書くときに見落としていました。
コンラッドルドルフ

3
さて、統計に関連することを行っている人なら誰でも、σが「標準偏差」を意味することを知っています。これは、そのドメインで非常によく知られている標準シンボルです。
TRiG

14

コードを理解していますか?それを読む必要がある他のみんなはいますか?もしそうなら、問題はありません。

個人的には、ASCIIのみのソースコードの裏を見てうれしいです。


できた (最後の行は、ASCIIのみのバージョンのコードを見たいと思っていたのでしょうか?)[](http://〜)
-badp

4
@badp:いいえ、ASCIIのみのコードの死を見るように頼みました。

Windows 1252システムに着陸したときにUnicodeソースファイルに何が起こるかを見始めるまで

1
@Thorbjørn:BOMが含まれている場合、何も起こらないことを期待します。

9

はい、あなたは気が狂っています。私は個人的にコメントで論文とフォーミュラ番号を参照し、すべてをASCIIで書きます。そうすれば、興味のある人なら誰でもコードと式を関連付けることができます。


5
コードと式そもそも一致することを確認するのは私にとって困難でした
...-badp

10
@Paul:幸いなことに、Unicodeは10年以上であるため、異議を申し立てられています。そして、異なるUTFの間に明確な勝者はありませんが、それは問題ではありません。1つは想定されていませんでした。ソフトウェアを区別するのは簡単です。
コンラッドルドルフ

1
@コンラッド:私はから10年後を意味します。かなりの数のプログラムがまだUnicodeをサポートしていません。さらに、私はあなたの主張に反対します-3つのutfsをすべて処理する一般的なリバースルーチンを書くことは簡単ではありません。明確な勝者が必要です。3つの異なるUTFをサポートする意味はありません(他のコードページがまだ残っているとは考えないでください)。
ポールネイサン

3
@ポール:「ジェネリックリバースルーチン」を書く必要がある頻度は?3つのUTFは異なる目的に使用され、統合の希望を得ることができるとは思いません。
ディーンハーディング

7
@ポール:これらのプログラムをねじ込みます。ユニコードの処理方法を知っている優れたエディターが十分にいます。一部の編集者がまだ時流に乗っていない場合は、経済的な選択に気をつけてください。そして、ディーンが言ったように、UTFは異なる目的に役立ちます。それらが存在するのは良いことです。そして、私はあなたの複数のリバースルーチンにそのポイントを見ていません。一度書くだけで(今のところ正規化フォームは無視されます)、個々のUTFではなくコードポイントのために。
コンラッドルドルフ

5

Unicode変数名の使用は、次の2つの理由から悪い考えだと思います。

  1. 入力するPITAです。

  2. 彼らはしばしば英語の手紙とほとんど同じように見えます。これは、数学表記でギリシャ文字を見ることを嫌うのと同じ理由です。pからrhoを区別してみてください。簡単ではない。


6
入力に使用するものに依存します。
エンドリス

4

この1つの場合、複雑な数学の数式、私はそれに行くと思います。

20年で、この複雑でギリシャ文字が元の数学に近いものをコード化する必要はなかったと言えます。理解できない場合は、それを維持するべきではありません。

あなたが私に遺した沼地の標準コードでµとσを維持しなければならないとしたら、私あなたがどこに住んでいるか知るでしょう...


3
  • プロ:それはよさそうだ
  • 短所:Unicode文字であるため、ツールチェーン(エディター、コードフォーマッター、バージョン管理、古いコンパイラ)で全体の意味が失われる可能性があります

あなたにとってのリスクはどれくらいですか?利益はリスクを上回っていますか?


2
ツールチェーン?どのツールチェーン?
badp

2
エディタ、コードフォーマッタ、バージョン管理、古いコンパイラ。ファイルに触れるすべてのツールと人。私は、ユニコードファイルであるYMMVを台無しにしたツールで悪い経験をしました。
レニープログラマー

2

近い将来、テキストエディタ/ IDE / Webブラウザを使用して、古典ギリシャ文字などを含む編集テキストを簡単に作成できるようになるでしょう(または、この「隠された"現在使用しているツールの機能...)

しかし、それが起こるまで、プログラムのソースコード内の非ASCII文字は多くのプログラマーが処理するのが難しいため、他の人が保守する必要があるアプリケーションを作成している場合は悪い考えです。

(ちなみに、ギリシャ語の文字を使用できるがPython識別子に平方根記号を使用できない理由は簡単です。ギリシャ文字はUnicode文字に分類されますが、平方根記号は文字ではありません。http://www.python.orgを参照してください。 / dev / peps / pep-3131 /


文字を直接入力できないユーザーのために文字を翻訳できるIMEを作成することは素晴らしいアイデアだと思います。
AndrejaKo

ええ、DVORAKに切り替えると、多かれ少なかれ。:(
badp

1
@AndrejaKo Linuxには、LaTeXスタイルのコマンドを受け入れるIMEがあります。\muつまり、ユーザーが入力すると、それが挿入されµます。
badp

@badpどうもありがとう!次回起動するときに試してみます!
AndrejaKo

Emacsは、Unicodeシンボルを簡単に入力できる便利な入力メソッドをサポートしています。(私が使用しているTeXを含む。)Emacsはほとんど未来的ではありません。(それはあるもちろん、素晴らしい。)
Tikhon Jelvis

2

使用している言語/コンパイラを言うことはしませんでしたが、通常、変数名の規則は、アルファベット文字またはアンダースコアで始まり、英数字とアンダースコアのみを含める必要があるということです。Unicode√は、文字ではなく数学記号であるため、英数字とは見なされません。ただし、σはギリシャ語のアルファベットなので、áはおそらく英数字と見なされます。


1

StackOverflowに同じ種類の質問を投稿しました

単純なASCIIでは不可能な数式を直接読み取ることができるため、数学関連の重い問題でUnicodeを使用する価値があると確信しています。

デバッグセッションを想像してください。もちろん、コードが計算するはずの式をいつでも手書きして、正しいかどうかを確認できます。しかし、90パーセントの時間、あなたは気にせず、バグは長い間ひっそりと隠されたままになります。そして、この7行の単純なASCII式を誰も喜んで見ません。もちろん、Unicodeの使用は、Texでレンダリングされた式ほど優れていませんが、はるかに優れています。

長い説明的な名前を使用する代替案は実行不可能です。なぜなら、数学では、識別子が短くない場合、式はさらに複雑に見えるからです(18世紀頃、人々は「プラス」を「+」に置き換え始めたと思います)および「-」による「マイナス」?)。

個人的には、下付き文字と上付き文字も使用します(このページからコピーアンドペーストするだけです)。例えば:(Pythonが識別子として√を許可していた)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Unicodeには同等の添え字がないため、上付き文字を使用しました。(残念ながら、Unicodeの添え字の文字セットは非常に限られています。いつか、Unicodeでの添え字が発音区別記号、つまり添え字に1文字、添え字に別の文字の組み合わせと見なされることを願っています)

最後にもう1つ、非ASCII文字の使用に関するこの会話は主にバイアスがかかっていると思います。多くのプログラマーが「式集約的な数学表記」を扱ったことがないからです。そのため、非ASCII識別子の使用を必要とするコードの重要な部分を経験したことがないため、この質問はそれほど重要ではないと考えています。あなたがそれらの1人である場合(そして私は最近まで)、これを考慮してください:文字 "a"がASCIIの一部ではないと仮定します。そうすれば、重要な数式を計算するときに、ギリシャ文字、下付き文字、上付き文字がまったくないという問題について、かなり良いアイデアを得ることができます。


0

このコードはあなたの個人的なプロジェクト専用ですか?もしそうなら、ナットを行き、あなたが望むものを使用します。

このコードは他の人が使用するためのものですか?すなわち、ある種のオープンソースアプリ?もしそうなら、おそらくプログラマーごとに異なるエディターを使用するため、トラブルを求めているだけであり、すべてのエディターがユニコードを正しくサポートするかどうかはわかりません。さらに、ソースコードファイルがtype'd / cat'dされたときにすべてのコマンドシェルが正しく表示されるわけではなく、html内で表示する必要がある場合は問題が発生する可能性があります。


0

個人的には、プログラミング言語をこの文脈の数学者のためのツールとして考えるように動機付けられています。私は実際に私のようなものに似た数学を使用していないからです。:D確かに、なぜɛやσなどを使用しないのか—その文脈では、実際にはもっと読みやすい。

(私は言わなければならないが、私の好みは、変数名ではなく、直接メソッド呼び出しとして上付き数字をサポートすることです。例えば、2²= 2 ** 2 = 4など)


-2

地獄とは何ですかσ、何とWは何ですかεcそして何γですか?
変数の目的を説明するような方法で変数に名前を付ける必要があります。
ASCIIバージョンの方が優れていますが、UnicodeまたはASCIIバージョンを維持するために残しておいた方は、個人的に打ち負かしたいと思います。

悪とは、変数σまたはsor sigmaまたはvalueorを呼び出すことですvar1。これは情報を伝えないためです。

コードを英語で書くと仮定すると(どこから来てもよいと思うので)、変数に意味のある名前を付けるにはASCIIで十分なので、Unicodeは実際には必要ありません。


2
彼が論文のコピー/ペーストを行い、1文字の変数名にもかかわらずコメントとしてソースコードの一部にした場合はどうでしょうか。
ブライアン

19
これらの変数名の多くは、問題のドメインに精通している人にとって強力な意味を持っています。ドメインに精通している人にとって、英語の名前はsigmaやrhoのような名前より読みにくいかもしれません。
dsimcha

3
これにはrank_error_with_99_pct_confidence少し長すぎるので、実際に数式を理解しやすくすることはできないと思います。AllegSkill / TrueSkillはこれらのシグマを呼び出すため、ドメイン固有の名前を維持することは完全に受け入れられると思います。
badp

3
@badp:良い名前は簡潔で説明的です。ただし、完全に説明する必要はありません。シグマについてrank_errorは、ドキュメント/コメントのどこかで99%の信頼性に関する追加の詳細を使用し、置くことは完全に適切です。
ライライアン

1
@dsimcha:特定のドメインに精通している人は、聞いたことがない人よりもかなり少ないと思います。そして、ドメインに精通している人は平易な英語の名前に対処できると思いますが、それに慣れていない人はギリシャ語の1文字の変数ですべてが難読化されていると、何が起こっているのかを完全に理解できなくなります。
back2dos

-2

よく知られている数学的な起源を持つ変数名の場合、これは絶対に受け入れられます-推奨されます。ただし、コードを配布する予定がある場合は、これらの値をモジュール、クラスなどに配置して、IDEオートコンプリートが奇妙な文字の「入力」を処理できるようにする必要があります。

識別子で√または²を使用します-それほどではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.