2016-06-14 14 views
-1

現在、私はPython辞書のためのファジーを探しています。私はすでにのようないくつかのファジングツールの認識しています:Fuzzer for Python dictionaries

しかし、彼らは私が探しています何のビット広いようです。実際、私の目標はPython辞書を与えられたツールに提供して、入力に非常に似た新しい辞書を取得することですが、いくつかの値を変更します。例えば

、私は次の新しい辞書を取得するつもり

{k1: "aaa", k2: "bbb", k3: "ccc"} 

を提供する:

{k1: "aaj", k2: "bbb", k3: "ccc"} 
{k1: "aaa", k2: "bbr", k3: "ccc"} 
{k1: "aaa", k2: "bbb", k3: "ccp"} 
... 

あなたはツールのこの種を知っていますか?どんな提案も歓迎されます。

最高のシナリオでは、これをオープンソースツールにしたいと思います。

EDIT1: 私は私が今までにしようと試みたコードをポスト:確かに

def change_randomly(self, v): 
    from random import randint 
    import string 

    new_v = list(v) 
    pos_value = randint(0, len(v)-1) 
    random_char = string.letters[randint(0, len(string.letters)-1)] 

    new_v[pos_value] = str(random_char) 
    return ''.join(new_v) 

、それを向上させることができるので、私はそれに関するいかなる思想のために楽しみにしています。

ありがとうございます!質問へのコメントに基づいて

+0

辞書のサイズは何ですか?「いくつかの値」はどういう意味ですか?なぜ値の一部をランダムに変更しないのですか? –

+0

ツール/ライブラリへのリクエストは、明らかにトピック外であることに注意してください。 – jonrsharpe

+0

この簡単なタスクを達成するためにコードを完成させるためのヘルプをリクエストするのは大抵ここで歓迎されます;-)それはあなたがいくつかのコードをスケッチし、そして、@AbdulFatirが提案する/尋ねるように:いくつかの理由はありますか?サンプルでは、​​値の文字列の3番目の文字列が変更され、排他的にしか使われないのはなぜですか? – Dilettant

答えて

0

、なぜ単にこのような固定長のテンプレートベースのfuzzer書いていない。だから、

# 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'} 

:それはこれをもたらす可能性があるユースケースの入力時に

#! /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() 

をこれは、Pythonの知識が始まっているブートストラッピングの問題かもしれないので、OPを何か開始するべきです...

私はちょうどPEP8に準拠していますが、それはPython v2またはv3でも問題ありません。

ライブラリやいくつかの単純なエンハンスドコーディングで十分である場合は、多くのオープンエンドで評価してもらう必要があります。 OPだけが知っているでしょうが、この回答提案にコメントしたり、質問を更新したりできます。

ヒント:ほとんどの場合、SystemRandomを使用してより堅牢に並列化することができます。より高速な方法があるかもしれませんが、仕様ではパフォーマンスは私には見えませんでした。これは最高の教育であるので、印刷物は当然スパンコールされている。 HTH

更新: いくつかの類似性を維持するために、文字列の一部だけを変更するOPのコメントを読んだ、一つは例えばによって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'"} 

この機能の代わりに、他を呼び出すとき。