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

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

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

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

Q&A

解決済

2回答

1027閲覧

python eval(ラムダでももちろんOK) で、リスト内包を使いたい。

zanjibar

総合スコア206

Python

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

0グッド

0クリップ

投稿2018/05/22 05:49

編集2018/05/22 06:08

ptyhon

1operation = "'<br />'.join([x for x in xxx.split('\n')])" # ここは単なる文字列 2xxx = eval(operation)

上記はエラーになるのですが、operation の文字列を評価して、xxx の内容を書き換えたいのです。
ラムダでもなんでもいいのですが、可能な方法ご存知でしたらお教えください。
\n は、\n とエスケープしてもだめみたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

operationの文字列の先頭にrを付けてraw文字列としたらそのまま動きました。

python

1>>> xxx = "hoge\nfuga\n" 2>>> operation = r"'<br />'.join([x for x in xxx.split('\n')])" 3>>> eval(operation) 4'hoge<br />fuga<br />'

2. 字句解析 — Python 3.6.5 ドキュメント


ほぼ同様の結果が得られるであろう操作としては、こういったものも考えられます。

python

1>>> operation = r"'<br />'.join(xxx.split('\n'))" # これは完全に同じ 2>>> operation = r"xxx.replace('\n', '<br />')" # 完全に同じかどうか保証しかねます

また、evalを使う特別な事情がなければ、普通の方法でやってください。

投稿2018/05/22 05:59

hayataka2049

総合スコア30933

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

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

zanjibar

2018/05/22 06:14

```python operation = '<br />'.join([x for x in xxx.split('\n')]) xxx = eval('r"' + operation + '"') ``` でいけました。ありがとうございます。 設定ファイルに実行内容を書いておいて、読み込んだときに必要に応じて実行するようにしたいのです。 operation は、文字列なので、一旦 eval をかますことで解消しました。
zanjibar

2018/05/22 06:48

json に保存してから読み込む場合は、先に \n を\n とエスケープしておき、raw ではなくそのままeval をかけるのが良いようです。
guest

0

配列に分解することをメインに考えていますが、そもそも置換ではダメなんでしょうか?

python

1>>> s = 'hoge\nfuga' 2>>> s.replace('\n', '<br />') 3'hoge<br />fuga'

投稿2018/05/22 06:02

mather

総合スコア6753

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

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

zanjibar

2018/05/22 06:16

だめです。実行内容を設定ファイルに文字列で記入しておき、必要に応じて実行したいのです。 s.replace('\n', '<br />') を設定ファイルに書いておき実行したいのです。
mather

2018/05/22 06:36

なるほど。やんごとなき事情があるなら仕方ないと思いますが、別の回答者の方もおっしゃっているように可能な限り `eval` は避けるべきですのでお気をつけください。
zanjibar

2018/05/22 06:49 編集

設定ファイルのデータの修正に使うためです。プログラムの変更をできるだけさけるための手段です。 設定ファイルごとにコードが分岐するなどありえないですし、設定ファイル(もともとエクセルでつくっている)が正しいことは、非常にまれです。というわけですね。圏論的な発想では、データにエラー修正のプログラムが埋め込まれるのは常識なので、今後は、eval 使うなという常識もかわっていくかと思っています。
mather

2018/05/22 06:57

いえ、そういう場合はPythonコードをそのまま埋め込むのではなく、できること(機能)を言語化してDSLにする方が言語仕様に依存せず、管理しやすく安全だと思います。
zanjibar

2018/05/22 07:13

エクセルでつくられた間違いの多い設定データを扱うという状況です。DSLにするようなものではないです。関数に名前をつけるのは非常に苦痛です。また、DSLにするというのは従来の発想です。圏論的にデータにエラー処理コードを埋め込み、エラー処理を行うという発想は、関数言語系の人は、当然というかこれからのモダンなプログラミングだという認識はあるようです。
mather

2018/05/22 08:53

圏論や関数型言語をだいぶ高尚な概念のように思っていらっしゃるようですね。 データにエラー訂正を埋め込むという概念は符号理論で聞く話ですがバーコードやQRコードの話なので関係ありません。データに修正が必要かという問題は解釈する側で判断しないと原理的にわからないですよね。もしデータそのものにフォーマット違反など入出力定義上の間違いがあるならデータそのものが出力される前にバリデーションがなされるべきだと思います。 もしMaybeやEitherなどのモナドに関する話であれば、「エラーを含む結果そのもの」を型(データ)で表現可能であるという話であって、結局エラーを修正するかどうかはその後の処理の問題です。圏論はモナドに関連して出てくる集合の圏と射に関する数学の概念ですが、これはもはやエラー修正云々とは別の話かと思います。 関数型言語においては値として第一級関数を扱うことが多いですが、それもやはり自分たちであらかじめ定義している高階関数に値を渡して生成される関数を使うものです。外部から渡されたデータをそのまま信用して処理をすることは(社内だからとか関係なく)どの言語の場合でも大変危険です。 この質問から完全に脱線してますね。すみません。それでは頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問