Quine投稿については こちら
exec
を使用して、文字列としてquineのコードを書く際のエスケープに、非常に苦労しました。
記事中のコードではダブルクォーテーションと、バッククォートをUnicodeエスケープしています。
より、スマートな方法があれば、是非コメントで教えてください。
[ バージョン情報(sys.version
) ]
3.8.2 (default, Apr 23 2020, 14:22:33)
[GCC 8.3.0]
この記事のAPIを実行したコード
quineRequest.py
authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdi'
z="\\"
escape_def_code = """
def escape(s):
return s.replace(\u0022'\u0022, z + 'u0027').replace('\u0022', z * 2 + 'u0022').replace('\u0060', z * 2 + 'u0060')
"""
exec_code = """
import sys
import requests
import json
url = 'https://qiita.com/api/v2/items'
headers = {{
'Authorization': '{0}',
'Content-Type': 'application/json'
}}
title = 'Qiita APIでQuine投稿(Python)'
body = '''
Quine投稿については **[こちら](https://qiita.com/j5c8k6m8/items/bc2324ef036729da1a28)**
\u0060exec\u0060 を使用して、文字列としてquineのコードを書く際のエスケープに、非常に苦労しました。
記事中のコードではダブルクォーテーションと、バッククォートをUnicodeエスケープしています。
より、スマートな方法があれば、是非コメントで教えてください。
[ バージョン情報(\u0060sys.version\u0060) ]
**'''
body += sys.version
body += '''**
# この記事のAPIを実行したコード
\u0060\u0060\u0060 python:quineRequest.py
authorization_token = 'Bearer 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdi'
'''
body += ('z=\u0022' + (z * 2) + '\u0022')
body += '''
escape_def_code = \u0022\u0022\u0022{1}\u0022\u0022\u0022
exec_code = \u0022\u0022\u0022{2}\u0022\u0022\u0022
exec_exec_code = \u0022\u0022\u0022{3}\u0022\u0022\u0022
{3}
\u0060\u0060\u0060
'''
tag = [{{'name': 'Qiita'}}, {{'name': 'Python'}}, {{'name': 'quine'}}, {{'name': 'QiitaAPI'}}, {{'name': 'quine投稿'}}]
post_data = {{
'private': False,
'body': body,
'title': title,
'tags': tag,
}}
r = requests.post(url, headers=headers, data=json.dumps(post_data))
"""
exec_exec_code = """
exec(escape_def_code)
exec(exec_code.format(authorization_token, escape(escape_def_code), escape(exec_code), escape(exec_exec_code)))
"""
exec(escape_def_code)
exec(exec_code.format(authorization_token, escape(escape_def_code), escape(exec_code), escape(exec_exec_code)))