Пытаясь немного улучшить ответ @ john-la-rooy, я создал небольшой класс, позволяющий простую насмешку для юнит-тестов
Должен работать с python 2 и 3
try:
import urllib.request as urllib
except ImportError:
import urllib2 as urllib
from io import BytesIO
class MockHTTPHandler(urllib.HTTPHandler):
def mock_response(self, req):
url = req.get_full_url()
print("incomming request:", url)
if url.endswith('.json'):
resdata = b'[{"hello": "world"}]'
headers = {'Content-Type': 'application/json'}
resp = urllib.addinfourl(BytesIO(resdata), header, url, 200)
resp.msg = "OK"
return resp
raise RuntimeError('Unhandled URL', url)
http_open = mock_response
@classmethod
def install(cls):
previous = urllib._opener
urllib.install_opener(urllib.build_opener(cls))
return previous
@classmethod
def remove(cls, previous=None):
urllib.install_opener(previous)
Используется так:
class TestOther(unittest.TestCase):
def setUp(self):
previous = MockHTTPHandler.install()
self.addCleanup(MockHTTPHandler.remove, previous)
Вы можете использовать словарь элементов, сопоставленных с их заменами, а затем использовать его в правой части поиска / замены.
:let r={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E'}
:%s/\v(a|b|c|d|e)/\=r[submatch(1)]/g
См. : h sub-replace - \ =
и : h submatch ()
. Если вы хотите втиснуть это в одну строку, вы можете использовать буквальный словарь.
:%s/\v(a|b|c|d|e)/\={'a':'A','b':'B','c':'C','d':'D','e':'E'}[submatch(1)]/g
Конкретный пример, который вы привели с заглавными буквами, проще было бы сделать как
:%s/[a-e]/\U\0/g
:% s / (a \ | b \ | c \ | d \ | e \ | f) / \ U \ 0 / g