-1

次の形式で引数をとる基本的な MAC チェンジャー アプリケーションを Kali Linux で作成しています。

python mac_changer.py -i <interface> -m <new MAC address>

PyCharm では、引数を取ってそれを返す次の関数を作成しました。解析された戻り値を保存できますが、ユーザーがインターフェイスを入力しない場合に備えて、プログラムがユーザーにインターフェイスと新しい MAC アドレスを要求できるようにしたいと考えています。コマンドのMAC。解析された引数をオプション変数の形式で返すことができます。入力された引数を返すこともできますが、入力された引数を保存する方法はありますか? すべてのモジュールが適切にインポートされ、次のコードは完全なプログラムの一部です

def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", dest="interface", help="Interface to change its MAC address")
    parser.add_option("-m", "--mac", dest="new_mac", help="New MAC address")
    (options, arguments) = parser.parse_args()
    if options.interface and options.new_mac:
        if not options.interface:
            #Code to handle error
            parser.error(("[-] Please specify an interface, use --help for more info"))
        elif not options.new_mac:
            #Code to handle error
            parser.error(("[-] Please specify a new MAC, use --help for more info"))
        return options
    else:
        return input("Inteface> "),input("New MAC> ")

options = get_arguments()
printf(options.interface)
printf(options.new_mac)

これは、上記のコマンドラインから指定された引数を出力しますが、解析された引数と一緒に入力関数を使用して、コードがユーザーから取得した引数も保存して使用したいと考えています。

4

1 に答える 1

0

コードは基本的に機能しますが、2 つの異なる戻り値の型があるため、これには問題があります。

        return options  # argparse.Namespace object
    else:
        return input("Inteface> "),input("New MAC> ")  # tuple of two strings

options = get_arguments()
printf(options.interface)
printf(options.new_mac)

このコードで型チェッカーを使用して戻り値の型に注釈を付けると、これらの行のいずれかでエラーが発生します。タプルとして返さoptionsれ、呼び出し元が にアクセスしようとすると、タプルには というフィールドがないため、options.interfaceanが発生します。AttributeErrorinterface

最も簡単な修正は、関​​数がどちらの場合も文字列タプルとして返されると言うだけinterfaceです。new_mac

from typing import Tuple

def get_arguments() -> Tuple[str, str]:
    """Returns interface, new_mac args, either from command line or user input"""
    ...

その後:

        return options.interface, options.new_mac
    else:
        return input("Interface> "),input("New MAC> ")

interface, new_mac = get_arguments()
print(interface)
print(new_mac)

少し良い解決策 IMO は、 a を使用することNamedTupleです。これは基本的に、名前を付けることができるタプルと、その個々のフィールドの名前です。

from typing import NamedTuple

class ChangerOptions(NamedTuple):
    interface: str
    new_mac: str

def get_arguments() -> ChangerOptions:

    ...

        return ChangerOptions(options.interface, options.new_mac)
    else:
        return ChangerOptions(input("Interface> "),input("New MAC> "))

options = get_arguments()
print(options.interface)
print(options.new_mac)

実行時に型注釈がなく、複数の可能な戻り値の型を持つ関数を呼び出さなければならない場合 (つまり、他の誰かのコードを使用していて、彼らはあなたを苦しめたいと思っているひどい人です)、それに対処することは可能です。呼び出しコードで次のようなことを行います。

        return options  # argparse.Namespace object
    else:
        return input("Inteface> "),input("New MAC> ")  # tuple of two strings


options = get_arguments()
try:
    # this will raise an AttributeError if no fields with these names
    interface, new_mac = options.interface, options.new_mac
except AttributeError:
    # whoops -- maybe it's a tuple?
    # this will raise a TypeError if that wasn't right either...
    interface, new_mac = options
print(interface)
print(new_mac)
于 2020-05-10T16:39:10.933 に答える