質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

844閲覧

変数名を臨時変更したいですけれども、なかなか方法見つからない

insecticide

総合スコア315

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/19 01:05

編集2022/11/19 04:47

メンテナンスの良さから変数名が長くなりがちで、数学計算式に利用する時にめちゃくくちゃ見にくいのです。
そのために、色々調べたり、試したりしたけれども、有効な方法はまだ分かりません。

やりたい事:
例えば、
alias a = self.aaaaaaaaaaaaaaaa
にして、a とself.aaaaaaaaaaaaaaaaとはあくまで同一変数(メモリアドレス)に対する異なる名付けで(別名)、片一方が変化したら、もう一方も自動的に同じ変化します。

残念ながら、上記の"alias" で エラーが発生しました。

アイディアをお願い致します。

ーーーーーーーーーーーーーーーーーーーーーーーーー
追伸:下のリンクの中のやり方に非常に気に入ります。

python

1class A: 2 __init__(): 3 self.a.b.c = 10 4 alias self.aliased = self.a.b.c # Creates an alias 5

《Pythonで変数のエイリアスを作成するにはどうすればよいですか?》
https://www.web-dev-qa-db-ja.com/ja/python/python%E3%81%A7%E5%A4%89%E6%95%B0%E3%81%AE%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1066749654/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2022/11/19 02:20

「alias」というのはどこから出てきたものですか?
meg_

2022/11/19 02:38

> alias a = self.aaaaaaaaaaaaaaaaにして classの話なのでしょうか?
insecticide

2022/11/19 04:49

TakaiYさま、meg_さま お返事ありがとうございます❣ 情報不足で申し訳ございませんでした。 質問の処に補充しましたので、また宜しくお願いいたします。
TakaiY

2022/11/19 05:15 編集

参照しているページに回答が書いてありますが、それで何が問題でしょうか。
TakaiY

2022/11/19 05:40

meg_さんも書いていますが、「変数名を臨時変更したい」というのは、クラスの中でのことですか? だとすると臨時ではありませんね。 臨時とはどういう意味ですか?
insecticide

2022/11/19 06:41

お返事ありがとうございます。 💖 > それで何が問題でしょうか 例文の「alias」の処にエラーが発生しました: alias a = self.aaaaaaaaaaaaaaa ^ SyntaxError: invalid syntax
insecticide

2022/11/19 06:56

変数名の長短問題だけでなく、名前自身も分かりにくい原因になります。 オリジナルの名付けはアプリケーションの中の意味で、計算式の中の変数の意味とは全然違います。 複雑な計算を行う時に、我々は、数学的な立場で変数名を見るのは直感的で、実装ミスを発見しやすいのですが、アプリケーションのための名前で数式を表現しますと、訳が分からなくなります。 特に私のような、頭が良くない人間にとって。
TakaiY

2022/11/19 07:35

> 例文の「alias」の処にエラーが発生しました www ちゃんと読んだらわかりますが、質問者はこんなふうにできたらいいのにという意図でそのコードを書いていますので、そもそもpythonの文として正しい文ではありません。 (他言語の自動飜訳っぽいサイトですからわかりにくいですが。 元記事へのリンクも無いので確認のしようもありません。お勧めしません。)
TakaiY

2022/11/19 08:53

stackoverflowだったんですね。
TakaiY

2022/11/19 08:56

> アプリケーションのための名前で数式を表現しますと、訳が分からなくなります。 ってことは、そのクラス/モジュールの外でその値を参照するときに別の名前を使いたいということですか? 値の変更もしますか?
insecticide

2022/11/19 09:38

> そのクラス/モジュールの外でその値を参照するときに別の名前を使いたいということですか? 値の変更もしますか? 同じクラス中のself.メソッドで複数のself.変数を利用して計算を行います。 計算過程においての更新も元の変数に反映したいのです。 簡単に言えば、C言語のマクロ定義のようなやり方で十分ですし、 alias a = self.aaaaaaaaaaaaaa のような alias キーワードがあれば簡単にできます。 Python はあれこれ複雑な仕組みが用意しているらしいですので、こんな簡単な事をシンプルに実現できるのではと思いきや、、、
insecticide

2022/11/19 09:44 編集

当然計算アルゴリズムの表現する前に a = self.aaaaaaaaaaaaa b = self.bbbbbbbbbbbbb c = self.cccccccccccccccc .................. <アルゴリズムの実装> self.aaaaaaaaaaaaa = a self.bbbbbbbbbbbbb = b self.cccccccccccccccc = c .................. にすれば目的を達成する事は可能ですが、非能率で、ミスの機会を増やしたような感じですね。
TakaiY

2022/11/19 09:46

であれば、回答は出ていますね。
guest

回答4

0

短い名前でproperty足せばええやん。

投稿2022/11/19 01:30

matukeso

総合スコア1590

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/11/19 09:02 編集

アイディアありがとうございます 💖 ご提案の方法は半分目的達成できますが。 元の変数の自動更新はできません。
guest

0

matukeso 氏の「短い名前でproperty足せばええやん。」というのは以下の様な事です。

property に関しては Built-in Functions: class property を参照して下さい

python

1class Parrot: 2 def __init__(self): 3 self.aaaaaaaaaaaaaaaa = 1 4 5def bind_alias(cls, src, dest): 6 setattr(cls, dest, property( 7 # getter 8 lambda self: getattr(self, src), 9 # setter 10 lambda self, value: setattr(self, src, value))) 11 12if __name__ == '__main__': 13 p = Parrot() 14 bind_alias(Parrot, 'aaaaaaaaaaaaaaaa', 'a') 15 16 print(f'{p.aaaaaaaaaaaaaaaa = }') 17 print(f'{p.a = }') 18 19 p.aaaaaaaaaaaaaaaa += 1 20 print(f'{p.aaaaaaaaaaaaaaaa = }') 21 print(f'{p.a = }') 22 23 p.a += 1 24 print(f'{p.aaaaaaaaaaaaaaaa = }') 25 print(f'{p.a = }') 26 27# 28# p.aaaaaaaaaaaaaaaa = 1 29# p.a = 1 30# 31# p.aaaaaaaaaaaaaaaa = 2 32# p.a = 2 33# 34# p.aaaaaaaaaaaaaaaa = 3 35# p.a = 3

投稿2022/11/19 04:57

melian

総合スコア19703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/11/19 16:36

素晴らしいテクニック感動的です。 💖 とても啓蒙的でありがとうございます。 本来持つべき機能を実現するために、Pythonがあれこれ複雑な仕組みを用意してくれたんですね。😂
guest

0

自己解決

Python は訳の分からないか99.9%の確率で使わない『機能』や『仕組み・からくり』ががんがん増えてきますが、
実行速度の改善やC言語のマクロのような機能等のような地味で実用的なやり方に進化はないようです。

掲題の問題は一見簡単そうですけれども、多くの専門家の方方から助言を頂いたにも関わらず、理想な解決方法はまだ分かりません。
《諦める》のを《自己解決》にしました。

投稿2022/11/21 17:50

編集2022/11/21 18:06
insecticide

総合スコア315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

せっかくメンテナンス性のために長い名前つけてるんですから、計算式を書くのに煩雑な部分だけ関数出ししてはいかがですか ? 変にaliasつけると、ソースの中に一つの変数に複数の名前を付けることになるのでせっかくわかりやすくつけた長い変数名がもったいないです

python

1def longlongadd( a,b): 2 return a+b 3... 4longlongnamec = longlongadd( longlongnamea, longlongnameb) 5

投稿2022/11/19 06:27

glp

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

insecticide

2022/11/26 04:04 編集

アイディアありがとうございます。💘 いただいた例だと、longlongadd(...)の中で、もしa,bに対する更新があれば、自動的に元の変数longlongnamea, longlongnamebへ反映しませんね。 科学計算の場合、各変数で互いに更新しながら、計算していくコースが多く、最終結果も元に反映しなければなりません。
insecticide

2022/11/19 06:54 編集

変数名の長短問題だけでなく、名前自身も分かりにくい原因になります。 オリジナルの名付けはアプリケーションの中の意味で、計算式の中の変数の意味とは全然違います。 複雑な計算を行う時に、我々は、数学的な立場で変数名を見るのは直感的で、実装ミスを発見しやすいのですが、アプリケーションのための名前で数式を表現しますと、訳が分からなくなります。 特に私のような、頭が良くない人間にとって。
glp

2022/11/20 00:47

私も論文から引用した長い科学計算をすることが多いですが、長いものでもせいぜいギリシャ文字くらいなのでsigmaとかomegaとかはあまり苦にならずにそのまま変数名にしてます。 関数化して計算途中に互いに代入し合うものは関数極力ローカルに閉じ込めて行きたいのですが、そうも言ってられないほどややこしい物もたまにありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問