Основываясь на комментариях к вопросу, почему бы не просто написание fuzzer на основе шаблона фиксированной длины, как это:
#! /usr/bin/env python
"""Minimal template based dict string value fuzzer."""
from __future__ import print_function
import random
import string
def random_string(rng, length, chars=string.printable):
"""A random string with given length."""
return ''.join(rng.choice(chars) for _ in range(length))
def dict_string_template_fuzz_gen(rng, dict_in):
"""Given a random number generator rng, and starting from
template dict_in expected to have only strings as values,
this generator function yields derived dicts with random
variations in the string values keeping the length of
those identical."""
while True:
yield dict((k, random_string(rng, len(v))) for k, v in dict_in.items())
def main():
"""Drive a test run of minimal template fuzz."""
k1, k2, k3 = 'ka', 'kb', 'kc'
template = {k1: "aaa", k2: "bbb", k3: "ccc"}
print("# Input(template):")
print(template)
rng = random.SystemRandom()
print("# Output(fuzz):")
for n, fuzz in enumerate(dict_string_template_fuzz_gen(rng,
template), start=0):
print(fuzz)
if n > 3:
break
if __name__ == '__main__':
main()
В случае варианта использования входа он может дать это:
# Input(template):
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'}
# Output(fuzz):
{'kc': '6HZ', 'kb': 'zoD', 'ka': '5>b'}
{'kc': '%<\r', 'kb': 'g>v', 'ka': 'Mo0'}
{'kc': 'Y $', 'kb': '4z.', 'ka': '0".'}
{'kc': '^M.', 'kb': 'QY1', 'ka': 'P0)'}
{'kc': 'FK4', 'kb': 'oZW', 'ka': 'G1q'}
Так это должно дать OP что-то начать, поскольку это может быть проблема начальной загрузки, где знание Python только начинается ...
Я только что взломал его - PEP8 совместим, хотя - и он должен работать независимо от того, Python v2 или v3.
Многие открытые концы для работы ... но должны получить оценку, если библиотека или простое расширенное кодирование могут быть достаточными. Только ОП будет знать, но можно прокомментировать это предложение ответа или обновить вопрос.
Подсказки: я почти всегда использую SystemRandom, чтобы вы могли распараллеливать более уверенно. Там могут быть более быстрые способы, но производительность не была видна мне в спецификации. Печатные издания, конечно же, спрятаны, поскольку в лучшем случае это образование. НТН
Update: Прочитав О.П. комментарий об изменении только часть строк, чтобы сохранить некоторое сходство, можно обменивать выше функции fuzzer, например, посредством:
def dict_string_template_fuzz_len_gen(rng, dict_in, f_len=1):
"""Given a random number generator rng, and starting from
template dict_in expected to have only strings as values,
this generator function yields derived dicts with random
variations in the string values keeping the length of
those identical.
Added as hack the f_len parameter that counts the
characters open to be fuzzed from the end of the string."""
r_s = random_string # shorten for line readability below
while True:
yield dict(
(k, v[:f_len + 1] + r_s(rng, f_len)) for k, v in dict_in.items())
и затем в качестве выхода образца:
# Input(template):
{'kc': 'ccc', 'kb': 'bbb', 'ka': 'aaa'}
# Output(fuzz):
{'kc': 'cc\t', 'kb': 'bbd', 'ka': 'aa\\'}
{'kc': 'cc&', 'kb': 'bbt', 'ka': 'aa\\'}
{'kc': 'ccg', 'kb': 'bb_', 'ka': 'aaJ'}
{'kc': 'ccc', 'kb': 'bbv', 'ka': 'aau'}
{'kc': 'ccw', 'kb': 'bbs', 'ka': "aa'"}
При вызове этой функции вместо другого.
Каков размер ваших словарей и что вы подразумеваете под «некоторыми значениями»? Почему бы просто не случайно изменить некоторые значения? –
Обратите внимание, что запросы инструментов/библиотек явно не соответствуют теме. – jonrsharpe
Запрашивать помощь для завершения части кода для выполнения этой простой задачи обычно приветствуется здесь ;-) Было бы хорошо, что вы набросаете код, а другие помогают вам, где вы застряли? И как @AbdulFatir предлагает/спрашивает: есть ли какая-то причина, почему в образце изменяется только третий chatter строк значений и только исключительно? – Dilettant