web-dev-qa-db-fra.com

Python: importer et initialiser Argparse après if __name__ == '__main__'?

Si j'utilise argparse et un if __name__ == '__main__' test dans un script que j'aimerais aussi utiliser comme module, dois-je importer argparse sous ce test puis l'initialiser? Aucun des guides de style que j'ai trouvés ne mentionne l'utilisation d'argparse dans les scripts et de nombreux exemples de scripts argparse n'utilisent pas le test 'if name' ou ne l'utilisent pas différemment. Voici ce que j'ai fait jusqu'ici:

#! /usr/bin/env python

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)

Dois-je importer argparse avec mes autres modules en haut et le configurer dans le corps du script à la place?

29
Daniel

Je mettrais l'importation en haut, mais je laisserais le code qui l'utilise dans le if __name__ bloquer:

import argparse

# other code. . .

def main(name):
    print('Hello, %s!' % name)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description = 'Say hello')
    parser.add_argument('name', help='your name, enter it')
    args = parser.parse_args()

    main(args.name)

Mettre les importations en haut clarifie quels modules votre module utilise. L'importation d'argpase même si vous ne l'utilisez pas aura un impact négligeable sur les performances.

34
BrenBarn

C'est bien de mettre le import argparse dans le if __name__ == '__main__' bloquer si argparse n'est mentionné que dans ce bloc. Évidemment, le code dans ce bloc ne s'exécutera pas si votre module est importé par un autre module, de sorte que ce module devrait fournir son propre argument pour main (en utilisant éventuellement sa propre instance de ArgumentParser) .

5
101