Чтобы прочитать файл, лучше использовать with
, чтобы избежать явного вызова open
и close
:
with open(myfile) as fh:
lines = fh.readlines()
Вы можете не указывать флаг 'r'
,поскольку файлы будут автоматически открываться в режиме чтения.
Здесь вы можете увидеть, находится ли один из ваших типов событий в строке, используя цикл for
, например:
f_types = ['Event', 'constructor', 'function']
for line in lines:
for f in f_types:
if f in line:
break
else:
continue
else
здесь проверяет, что итерация по f_types
завершена (break
не произошло), поэтому мы пропустим строки, у которых нет заметных событий (f_types
)
Далее, мы можем использовать следующий шаблон регулярных выражений, чтобы найти все наши аргументы:
res = re.findall('\((.*?)\)', line)
# for the line constructor(bytes32[] memory var3, address[] var4)
# this returns ['bytes32[] memory var3, address[] var4']
# Now we want to split the line on commas to give each declaration and
# grab the last statement because we don't care about anything but the name
args = [x.split()[-1] for x in res[0].split(',')]
Теперь, чтобы сохранить все это, весь скрипт становится следующим:
f_types = ['Event', 'constructor', 'function']
allargs = [] # to store all of our replace calls at the end
with open(myfile) as fh:
lines = fh.readlines()
for line in lines:
for f in f_types:
if f in line:
break
else:
continue
in_parens = re.findall('\w+\((.*?)\)', line)[0]
args = [x.split()[-1] for x in in_parens.split(',')
allargs.extend(args)
ПослеВыполнение этого, allargs
будет выглядеть так:
# ['var1', 'var2', 'var3', 'var4', 'var3[i]', 'var4[i]', 'var5']
Теперь, заимствуя из ответа @ Джина выше, я не слишком беспокоюсь о дублированных var3
и var4
, потому что мы установили теграницы строки:
whole_file = '\n'.join(lines)
for arg in allargs:
whole_file = re.sub(r"\b(%s)\b" % arg, r'_\1', whole_file)
А теперь ваш файл выглядит как
pragma solidity 0.4.25;
import "./interfaces/IMyContract.sol";
/**
* @title My Contract.
*/
contract MyContract is IMyContract {
string public constant version = "1.0.0";
mapping(bytes32 => address) private something;
event Event(bytes32 indexed _var1, address indexed _var2);
/**
* @dev ...
* @param _var3 ...
* @param _var4 ...
*/
constructor(bytes32[] memory _var3, address[] _var4) public {
uint256 length = _var3.length;
require(length == _var4.length);
for (uint256 i = 0; i < length; i++) {
require(uint256(something[_var3[i]]) == 0);
something[_var3[i]] = _var4[i];
emit Event(_var3[i], _var4[i]);
}
}
/**
* @dev ...
* @param _var5 ...
*/
function get(bytes32 _var5) external view returns (address) {
return something[_var5];
}
}