forked from AFPy/python-docs-fr
Traduction de library/timeit.po (#859)
This commit is contained in:
parent
a046efba6f
commit
df62d8f3c4
|
@ -6,17 +6,18 @@ msgstr ""
|
|||
"Project-Id-Version: Python 3.6\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-05-23 16:48+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"PO-Revision-Date: 2019-08-20 18:10+0200\n"
|
||||
"Language-Team: FRENCH <traductions@lists.afpy.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Last-Translator: \n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: ../Doc/library/timeit.rst:2
|
||||
msgid ":mod:`timeit` --- Measure execution time of small code snippets"
|
||||
msgstr ""
|
||||
msgstr ":mod:`timeit` — Mesurer le temps d'exécution de fragments de code"
|
||||
|
||||
#: ../Doc/library/timeit.rst:7
|
||||
msgid "**Source code:** :source:`Lib/timeit.py`"
|
||||
|
@ -30,24 +31,35 @@ msgid ""
|
|||
"execution times. See also Tim Peters' introduction to the \"Algorithms\" "
|
||||
"chapter in the *Python Cookbook*, published by O'Reilly."
|
||||
msgstr ""
|
||||
"Ce module fournit une façon simple de mesurer le temps d'exécution de "
|
||||
"fragments de code Python. Il expose une :ref:`timeit-command-line-interface` "
|
||||
"ainsi qu'une :ref:`interface Python <python-interface>`. Ce module permet "
|
||||
"d'éviter un certain nombre de problèmes classiques liés à la mesure des "
|
||||
"temps d'exécution. Voir par exemple à ce sujet l'introduction par Tim Peters "
|
||||
"du chapitre « Algorithmes » dans le livre *Python Cookbook*, aux éditions "
|
||||
"O'Reilly."
|
||||
|
||||
#: ../Doc/library/timeit.rst:23
|
||||
msgid "Basic Examples"
|
||||
msgstr ""
|
||||
msgstr "Exemples simples"
|
||||
|
||||
#: ../Doc/library/timeit.rst:25
|
||||
msgid ""
|
||||
"The following example shows how the :ref:`timeit-command-line-interface` can "
|
||||
"be used to compare three different expressions:"
|
||||
msgstr ""
|
||||
"L'exemple suivant illustre l'utilisation de l':ref:`timeit-command-line-"
|
||||
"interface` afin de comparer trois expressions différentes :"
|
||||
|
||||
#: ../Doc/library/timeit.rst:37
|
||||
msgid "This can be achieved from the :ref:`python-interface` with::"
|
||||
msgstr ""
|
||||
msgstr "L':ref:`python-interface` peut être utilisée aux mêmes fins avec : ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:47
|
||||
msgid "A callable can also be passed from the :ref:`python-interface`::"
|
||||
msgstr ""
|
||||
"Un objet appelable peut également être passé en argument à l':ref:`python-"
|
||||
"interface` ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:52
|
||||
msgid ""
|
||||
|
@ -55,14 +67,20 @@ msgid ""
|
|||
"repetitions only when the command-line interface is used. In the :ref:"
|
||||
"`timeit-examples` section you can find more advanced examples."
|
||||
msgstr ""
|
||||
"Notez cependant que :func:`.timeit` détermine automatiquement le nombre de "
|
||||
"répétitions seulement lorsque l'interface en ligne de commande est utilisée. "
|
||||
"Vous pouvez trouver des exemples d'usages avancés dans la section :ref:"
|
||||
"`timeit-examples`."
|
||||
|
||||
#: ../Doc/library/timeit.rst:60
|
||||
msgid "Python Interface"
|
||||
msgstr ""
|
||||
msgstr "Interface Python"
|
||||
|
||||
#: ../Doc/library/timeit.rst:62
|
||||
msgid "The module defines three convenience functions and a public class:"
|
||||
msgstr ""
|
||||
"Ce module définit une classe publique ainsi que trois fonctions destinées à "
|
||||
"simplifier son usage :"
|
||||
|
||||
#: ../Doc/library/timeit.rst:67
|
||||
msgid ""
|
||||
|
@ -71,11 +89,15 @@ msgid ""
|
|||
"executions. The optional *globals* argument specifies a namespace in which "
|
||||
"to execute the code."
|
||||
msgstr ""
|
||||
"Crée une instance d'objet :class:`Timer` à partir de l'instruction donnée, "
|
||||
"du code *setup* et de la fonction *timer*, puis exécute sa méthode :meth:`."
|
||||
"timeit` à *number* reprises. L'argument optionnel *globals* spécifie un "
|
||||
"espace de nommage dans lequel exécuter le code."
|
||||
|
||||
#: ../Doc/library/timeit.rst:72 ../Doc/library/timeit.rst:83
|
||||
#: ../Doc/library/timeit.rst:120
|
||||
msgid "The optional *globals* parameter was added."
|
||||
msgstr ""
|
||||
msgstr "Le paramètre optionnel *globals* a été ajouté."
|
||||
|
||||
#: ../Doc/library/timeit.rst:78
|
||||
msgid ""
|
||||
|
@ -84,22 +106,27 @@ msgid ""
|
|||
"count and *number* executions. The optional *globals* argument specifies a "
|
||||
"namespace in which to execute the code."
|
||||
msgstr ""
|
||||
"Crée une instance d'objet :class:`Timer` à partir de l'instruction donnée, "
|
||||
"du code *setup* et de la fonction *timer*, puis exécute sa méthode :meth:`."
|
||||
"repeat` à *number* reprises, *repeat* fois. L'argument optionnel *globals* "
|
||||
"spécifie un espace de nommage dans lequel exécuter le code."
|
||||
|
||||
#: ../Doc/library/timeit.rst:86 ../Doc/library/timeit.rst:181
|
||||
msgid "Default value of *repeat* changed from 3 to 5."
|
||||
msgstr ""
|
||||
msgstr "La valeur par défaut de *repeat* est passée de 3 à 5."
|
||||
|
||||
#: ../Doc/library/timeit.rst:91
|
||||
msgid "The default timer, which is always :func:`time.perf_counter`."
|
||||
msgstr ""
|
||||
msgstr "Le minuteur par défaut, qui est toujours :func:`time.perf_counter`."
|
||||
|
||||
#: ../Doc/library/timeit.rst:93
|
||||
msgid ":func:`time.perf_counter` is now the default timer."
|
||||
msgstr ""
|
||||
msgstr ":func:`time.perf_counter` est désormais le minuteur par défaut."
|
||||
|
||||
#: ../Doc/library/timeit.rst:99
|
||||
msgid "Class for timing execution speed of small code snippets."
|
||||
msgstr ""
|
||||
"Classe permettant de mesurer le temps d'exécution de fragments de code."
|
||||
|
||||
#: ../Doc/library/timeit.rst:101
|
||||
msgid ""
|
||||
|
@ -111,6 +138,16 @@ msgid ""
|
|||
"will by default be executed within timeit's namespace; this behavior can be "
|
||||
"controlled by passing a namespace to *globals*."
|
||||
msgstr ""
|
||||
"Ce constructeur prend en argument une instruction dont le temps d'exécution "
|
||||
"doit être mesuré, une instruction additionnelle de mise en place et une "
|
||||
"fonction de chronométrage. Les deux instructions valent ``'pass'`` par "
|
||||
"défaut; la fonction de chronométrage dépend de la plateforme d'exécution (se "
|
||||
"référer au *doc string* du module). *stmt* et *setup* peuvent contenir "
|
||||
"plusieurs instructions séparées par des ``;`` ou des sauts de lignes tant "
|
||||
"qu'ils ne comportent pas de littéraux sur plusieurs lignes. L'instruction "
|
||||
"est exécutée dans l'espace de nommage de *timeit* par défaut ; ce "
|
||||
"comportement peut être modifié en passant un espace de nommage au paramètre "
|
||||
"*globals*."
|
||||
|
||||
#: ../Doc/library/timeit.rst:109
|
||||
msgid ""
|
||||
|
@ -118,12 +155,18 @@ msgid ""
|
|||
"timeit` method. The :meth:`.repeat` and :meth:`.autorange` methods are "
|
||||
"convenience methods to call :meth:`.timeit` multiple times."
|
||||
msgstr ""
|
||||
"Pour mesurer le temps d'exécution de la première instruction, utilisez la "
|
||||
"méthode :meth:`.timeit`. Les méthodes :meth:`.repeat` et :meth:`.autorange` "
|
||||
"sont des méthodes d'agrément permettant d'appeler :meth:`.timeit` à "
|
||||
"plusieurs reprises."
|
||||
|
||||
#: ../Doc/library/timeit.rst:113
|
||||
msgid ""
|
||||
"The execution time of *setup* is excluded from the overall timed execution "
|
||||
"run."
|
||||
msgstr ""
|
||||
"Le temps d'exécution de *setup* n'est pas pris en compte dans le temps "
|
||||
"global d'exécution."
|
||||
|
||||
#: ../Doc/library/timeit.rst:115
|
||||
msgid ""
|
||||
|
@ -132,6 +175,11 @@ msgid ""
|
|||
"will then be executed by :meth:`.timeit`. Note that the timing overhead is "
|
||||
"a little larger in this case because of the extra function calls."
|
||||
msgstr ""
|
||||
"Les paramètres *stmt* et *setup* peuvent également recevoir des objets "
|
||||
"appelables sans argument. Ceci transforme alors les appels à ces objets en "
|
||||
"fonction de chronométrage qui seront exécutées par :meth:`.timeit`. Notez "
|
||||
"que le surcoût lié à la mesure du temps d'exécution dans ce cas est "
|
||||
"légèrement supérieur en raisons des appels de fonction supplémentaires."
|
||||
|
||||
#: ../Doc/library/timeit.rst:125
|
||||
msgid ""
|
||||
|
@ -142,6 +190,13 @@ msgid ""
|
|||
"statement, the setup statement and the timer function to be used are passed "
|
||||
"to the constructor."
|
||||
msgstr ""
|
||||
"Mesure le temps *number* exécution de l'instruction principale. Ceci exécute "
|
||||
"l'instruction de mise en place une seule fois puis renvoie un flottant "
|
||||
"correspondant au temps nécessaire à l'exécution de l'instruction principale "
|
||||
"à plusieurs reprises, mesuré en secondes. L'argument correspond au nombre "
|
||||
"d'itérations dans la boucle, par défaut un million. L'instruction "
|
||||
"principale, l'instruction de mise en place et la fonction de chronométrage "
|
||||
"utilisée sont passées au constructeur."
|
||||
|
||||
#: ../Doc/library/timeit.rst:134
|
||||
msgid ""
|
||||
|
@ -152,10 +207,16 @@ msgid ""
|
|||
"so, GC can be re-enabled as the first statement in the *setup* string. For "
|
||||
"example::"
|
||||
msgstr ""
|
||||
"Par défaut, :meth:`.timeit` désactive temporairement le :term:`ramasse-"
|
||||
"miettes` pendant le chronométrage. Cette approche a l'avantage de permettre "
|
||||
"de comparer des mesures indépendantes. L'inconvénient de cette méthode est "
|
||||
"que le ramasse-miettes peut avoir un impact significatif sur les "
|
||||
"performances de la fonction étudiée. Dans ce cas, le ramasse-miettes peut "
|
||||
"être réactivé en première instruction de la chaîne *setup*. Par exemple: ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:146
|
||||
msgid "Automatically determine how many times to call :meth:`.timeit`."
|
||||
msgstr ""
|
||||
msgstr "Détermine automatiquement combien de fois appeler :meth:`.timeit`."
|
||||
|
||||
#: ../Doc/library/timeit.rst:148
|
||||
msgid ""
|
||||
|
@ -165,16 +226,25 @@ msgid ""
|
|||
"numbers from the sequence 1, 2, 5, 10, 20, 50, ... until the time taken is "
|
||||
"at least 0.2 second."
|
||||
msgstr ""
|
||||
"Cette fonction d'agrément appelle :meth:`.timeit` à plusieurs reprises "
|
||||
"jusqu'à ce que le temps total écoulé soit supérieur à 0,2 secondes et "
|
||||
"renvoie le couple (nombre de boucles, temps nécessaire pour exécuter ce "
|
||||
"nombre de boucles). Elle appelle :meth:`.timeit` avec un nombre d'itérations "
|
||||
"croissant selon la séquence 1, 2, 5, 10, 20, 50, … jusqu'à ce que le temps "
|
||||
"d'exécution dépasse 0,2 secondes."
|
||||
|
||||
#: ../Doc/library/timeit.rst:154
|
||||
msgid ""
|
||||
"If *callback* is given and is not ``None``, it will be called after each "
|
||||
"trial with two arguments: ``callback(number, time_taken)``."
|
||||
msgstr ""
|
||||
"Si *callback* est spécifié et n'est pas ``None``, elle est appelée après "
|
||||
"chaque itération avec deux arguments (numéro de l'itération et temps "
|
||||
"écoulé) : ``callback(number, time_taken)``."
|
||||
|
||||
#: ../Doc/library/timeit.rst:162
|
||||
msgid "Call :meth:`.timeit` a few times."
|
||||
msgstr ""
|
||||
msgstr "Appelle :meth:`.timeit` plusieurs fois."
|
||||
|
||||
#: ../Doc/library/timeit.rst:164
|
||||
msgid ""
|
||||
|
@ -183,6 +253,10 @@ msgid ""
|
|||
"call :meth:`.timeit`. The second argument specifies the *number* argument "
|
||||
"for :meth:`.timeit`."
|
||||
msgstr ""
|
||||
"Cette fonction d'agrément appelle :meth:`.timeit` à plusieurs reprises et "
|
||||
"renvoie une liste de résultats. Le premier argument spécifie le nombre "
|
||||
"d'appels à :meth:`.timeit`. Le second argument spécifie l'argument *number* "
|
||||
"de :meth:`.timeit`."
|
||||
|
||||
#: ../Doc/library/timeit.rst:171
|
||||
msgid ""
|
||||
|
@ -195,21 +269,36 @@ msgid ""
|
|||
"only number you should be interested in. After that, you should look at the "
|
||||
"entire vector and apply common sense rather than statistics."
|
||||
msgstr ""
|
||||
"Il est tentant de vouloir calculer la moyenne et l'écart-type des résultats "
|
||||
"et notifier ces valeurs. Ce n'est cependant pas très utile. En pratique, la "
|
||||
"valeur la plus basse donne une estimation basse de la vitesse maximale à "
|
||||
"laquelle votre machine peut exécuter le fragment de code spécifié ; les "
|
||||
"valeurs hautes de la liste sont typiquement provoquées non pas par une "
|
||||
"variabilité de la vitesse d'exécution de Python, mais par d'autres processus "
|
||||
"interférant avec la précision du chronométrage. Le :func:`min` du résultat "
|
||||
"est probablement la seule valeur à laquelle vous devriez vous intéresser. "
|
||||
"Pour aller plus loin, vous devriez regarder l'intégralité des résultats et "
|
||||
"utiliser le bon sens plutôt que les statistiques."
|
||||
|
||||
#: ../Doc/library/timeit.rst:187
|
||||
#, fuzzy
|
||||
msgid "Helper to print a traceback from the timed code."
|
||||
msgstr ""
|
||||
msgstr "Outil permettant d'afficher la trace du code chronométré."
|
||||
|
||||
#: ../Doc/library/timeit.rst:189
|
||||
msgid "Typical use::"
|
||||
msgstr ""
|
||||
msgstr "Usage typique : ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:197
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The advantage over the standard traceback is that source lines in the "
|
||||
"compiled template will be displayed. The optional *file* argument directs "
|
||||
"where the traceback is sent; it defaults to :data:`sys.stderr`."
|
||||
msgstr ""
|
||||
"L'avantage par rapport à la trace standard est que les lignes sources du "
|
||||
"code compilé sont affichées . Le paramètre optionnel *file* définit "
|
||||
"l'endroit où la trace est envoyée, par défaut :data:`sys.stderr`."
|
||||
|
||||
#: ../Doc/library/timeit.rst:205
|
||||
msgid "Command-Line Interface"
|
||||
|
@ -219,41 +308,50 @@ msgstr "Interface en ligne de commande"
|
|||
msgid ""
|
||||
"When called as a program from the command line, the following form is used::"
|
||||
msgstr ""
|
||||
"Lorsque le module est appelé comme un programme en ligne de commande, la "
|
||||
"syntaxe suivante est utilisée : ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:211
|
||||
msgid "Where the following options are understood:"
|
||||
msgstr ""
|
||||
msgstr "Les options suivantes sont gérées :"
|
||||
|
||||
#: ../Doc/library/timeit.rst:217
|
||||
msgid "how many times to execute 'statement'"
|
||||
msgstr ""
|
||||
msgstr "nombre d'exécutions de l'instruction *statement*"
|
||||
|
||||
#: ../Doc/library/timeit.rst:221
|
||||
msgid "how many times to repeat the timer (default 5)"
|
||||
msgstr ""
|
||||
msgstr "nombre de répétitions du chronomètre (5 par défaut)"
|
||||
|
||||
#: ../Doc/library/timeit.rst:225
|
||||
msgid "statement to be executed once initially (default ``pass``)"
|
||||
msgstr ""
|
||||
"instruction exécutée une seule fois à l'initialisation (``pass`` par défaut)"
|
||||
|
||||
#: ../Doc/library/timeit.rst:229
|
||||
msgid ""
|
||||
"measure process time, not wallclock time, using :func:`time.process_time` "
|
||||
"instead of :func:`time.perf_counter`, which is the default"
|
||||
msgstr ""
|
||||
"mesure le temps au niveau du processus et non au niveau du système, en "
|
||||
"utilisant :func:`time.process_time` plutôt que :func:`time.perf_counter` qui "
|
||||
"est utilisée par défaut"
|
||||
|
||||
#: ../Doc/library/timeit.rst:236
|
||||
msgid ""
|
||||
"specify a time unit for timer output; can select nsec, usec, msec, or sec"
|
||||
msgstr ""
|
||||
"spécifie l'unité de temps utilisée pour la sortie du chronomètre (parmi "
|
||||
"*nsec*, *usec*, *msec* ou *sec*)"
|
||||
|
||||
#: ../Doc/library/timeit.rst:242
|
||||
#, fuzzy
|
||||
msgid "print raw timing results; repeat for more digits precision"
|
||||
msgstr ""
|
||||
msgstr "affiche les temps d'exécutions bruts, répéter pour plus de précision"
|
||||
|
||||
#: ../Doc/library/timeit.rst:246
|
||||
msgid "print a short usage message and exit"
|
||||
msgstr ""
|
||||
msgstr "affiche un court message d'aide puis quitte"
|
||||
|
||||
#: ../Doc/library/timeit.rst:248
|
||||
msgid ""
|
||||
|
@ -262,12 +360,19 @@ msgid ""
|
|||
"quotes and using leading spaces. Multiple :option:`-s` options are treated "
|
||||
"similarly."
|
||||
msgstr ""
|
||||
"Une instruction sur plusieurs lignes peut être donnée en entrée en "
|
||||
"spécifiant chaque ligne comme un argument séparé. Indenter une ligne est "
|
||||
"possible en encadrant l'argument de guillemets et en le préfixant par des "
|
||||
"espaces. Plusieurs :option:`-s` sont gérées de la même façon."
|
||||
|
||||
#: ../Doc/library/timeit.rst:253
|
||||
msgid ""
|
||||
"If :option:`-n` is not given, a suitable number of loops is calculated by "
|
||||
"trying successive powers of 10 until the total time is at least 0.2 seconds."
|
||||
msgstr ""
|
||||
"Si :option:`-n` n'est pas donnée, le nombre de boucles adapté est déterminé "
|
||||
"automatiquement en essayant les puissances de 10 successives jusqu'à ce que "
|
||||
"le temps total d'exécution dépasse 0,2 secondes."
|
||||
|
||||
#: ../Doc/library/timeit.rst:256
|
||||
msgid ""
|
||||
|
@ -278,6 +383,13 @@ msgid ""
|
|||
"probably enough in most cases. You can use :func:`time.process_time` to "
|
||||
"measure CPU time."
|
||||
msgstr ""
|
||||
"Les mesures de :func:`default_timer` peuvent être altérées par d'autres "
|
||||
"programmes s'exécutant sur la même machine. La meilleure approche lorsqu'un "
|
||||
"chronométrage exact est nécessaire est de répéter celui-ci à plusieurs "
|
||||
"reprises et considérer le meilleur temps. L'option :option:`-r` est adaptée "
|
||||
"à ce fonctionnement, les cinq répétitions par défaut suffisent probablement "
|
||||
"dans la plupart des cas. Vous pouvez utiliser :func:`time.process_time` pour "
|
||||
"mesurer le temps processeur."
|
||||
|
||||
#: ../Doc/library/timeit.rst:264
|
||||
msgid ""
|
||||
|
@ -286,6 +398,11 @@ msgid ""
|
|||
"it. The baseline overhead can be measured by invoking the program without "
|
||||
"arguments, and it might differ between Python versions."
|
||||
msgstr ""
|
||||
"Il existe un surcoût minimal associé à l'exécution de l'instruction `pass`. "
|
||||
"Le code présenté ici ne tente pas de le masquer, mais vous devez être "
|
||||
"conscient de son existence. Ce surcoût minimal peut être mesuré en invoquant "
|
||||
"le programme sans argument ; il peut différer en fonction des versions de "
|
||||
"Python."
|
||||
|
||||
#: ../Doc/library/timeit.rst:273
|
||||
msgid "Examples"
|
||||
|
@ -296,10 +413,14 @@ msgid ""
|
|||
"It is possible to provide a setup statement that is executed only once at "
|
||||
"the beginning:"
|
||||
msgstr ""
|
||||
"Il est possible de fournir une instruction de mise en place exécutée une "
|
||||
"seule fois au début du chronométrage :"
|
||||
|
||||
#: ../Doc/library/timeit.rst:292
|
||||
msgid "The same can be done using the :class:`Timer` class and its methods::"
|
||||
msgstr ""
|
||||
"La même chose peut être réalisée en utilisant la classe :class:`Timer` et "
|
||||
"ses méthodes : ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:302
|
||||
msgid ""
|
||||
|
@ -307,12 +428,19 @@ msgid ""
|
|||
"lines. Here we compare the cost of using :func:`hasattr` vs. :keyword:`try`/:"
|
||||
"keyword:`except` to test for missing and present object attributes:"
|
||||
msgstr ""
|
||||
"Les exemples qui suivent montrent comment chronométrer des expressions sur "
|
||||
"plusieurs lignes. Nous comparons ici le coût d'utilisation de :func:"
|
||||
"`hasattr` par rapport à :keyword:`try`/:keyword:`except` pour tester la "
|
||||
"présence ou l'absence d'attributs d'un objet :"
|
||||
|
||||
#: ../Doc/library/timeit.rst:348
|
||||
msgid ""
|
||||
"To give the :mod:`timeit` module access to functions you define, you can "
|
||||
"pass a *setup* parameter which contains an import statement::"
|
||||
msgstr ""
|
||||
"Afin de permettre à :mod:`timeit` d'accéder aux fonctions que vous avez "
|
||||
"définies, vous pouvez passer au paramètre *setup* une instruction "
|
||||
"d'importation: ::"
|
||||
|
||||
#: ../Doc/library/timeit.rst:359
|
||||
msgid ""
|
||||
|
@ -320,3 +448,6 @@ msgid ""
|
|||
"will cause the code to be executed within your current global namespace. "
|
||||
"This can be more convenient than individually specifying imports::"
|
||||
msgstr ""
|
||||
"Une autre possibilité est de passer :func:`globals` au paramètre *globals*, "
|
||||
"ceci qui exécutera le code dans l'espace de nommage global courant. Cela "
|
||||
"peut être plus pratique que de spécifier manuellement des importations: ::"
|
||||
|
|
Loading…
Reference in New Issue
Block a user