00:00 Este vídeo vai falar sobre a nova funcionalidade dos argumentos apenas posicionais. Vou começar com um exemplo. Quero começar este vídeo falando sobre uma função interna chamada float()
.
00:09float()
que pode ser usada para converter strings de texto ou números para objetos float
, como este. Se você falar sobre a função help()
na função incorporada float
, se você olhar a assinatura para float
aqui mesmo, você vai notar que há uma barra (/
) após o parâmetro. O que é que isso significa? Bem, acontece que há um parâmetro de float()
e chama-se x
, e não lhe é permitido usar o nome do parâmetro ao chamá-lo. Ao usar float()
, é-lhe permitido especificar argumentos apenas por posição, não por uma palavra-chave. Deixe-me mostrar-lhe o que eu quero dizer. Então novamente, repare na barra (/
) aqui. Pressionando q
para sair de help()
. Então, se você tentar float()
novamente e dizer x="3.8"
uma string de texto, você verá aqui que diz float() takes no keyword arguments
, apenas este argumento posicional.
00:53 Você não pode usar uma palavra-chave quando você especificar o argumento. Antes do Python 3.8, não havia uma maneira fácil de especificar que os argumentos devem ser apenas posicionais nas suas próprias funções. Então se você fosse definir algo como esta função – chamaremos incr()
(incremento).
01:10 Quando você chama incr()
, e digamos que você lhe dá uma flutuação, você poderia usar qualquer um dos métodos, e isso é normal para um argumento normal. E é aí que a mudança vem em Python 3.8.
01:24 Você poderia reescrever o incremento incr()
função para aceitar argumentos apenas posicionais. Ficaria mais assim, com uma vírgula (,
) do que uma barra (/
), e o resto é o mesmo.
01:40 Então quando você chama incr()
, isso funciona bem. Mas se você fosse agora usar a palavra-chave, algo novo aconteceria. Diz aqui incr() got some positional-only arguments passed as keyword arguments
.
01:55 Então isso irá levantar uma excepção e dar-lhe-á um TypeError
. Você pode usar isso quase como um divisor entre seus argumentos apenas posicionais e os argumentos regulares. Deixe-me tentar isso com outro exemplo.
02:07Definir uma nova função chamada greet()
. greet()
vai tomar um name
como argumento apenas posicional, então você vai colocar essa barra (/
) para que você possa combinar argumentos apenas posicionais com argumentos regulares. Então aqui está um argumento regular de um greeting
.
02:23Aqui você vai retornar um f-string com o greeting
. Se você ainda não trabalhou com f-strings, vou incluir um link no texto abaixo para artigos e cursos sobre ele.
02:31Comma, espaço, o name
. Então quando você chamar greet()
-agora, o padrão greeting
será "Hello"
.
02:37 Você vai entrar no name
aqui como um posicional apenas.
02:43Great. Você também pode chamar greet()
02:49 e dar-lhe um greeting
.
02:55 Mas o que você não pode fazer – ou o que lhe dará um erro – é se você digitar name
,
03:08 onde você terá uma exceção de um TypeError
. Mais uma vez, tal como no anterior, para incr()
, greet()
foram passados alguns argumentos apenas posicionais como argumentos de palavras-chave, especificamente name
. À primeira vista, argumentos posicionais podem parecer um pouco limitantes e contrários ao mantra do Python sobre a importância da legibilidade.
03:26 Você provavelmente descobrirá que não há muitas ocasiões em que argumentos apenas posicionais melhoram o seu código. Contudo, nas circunstâncias certas, pode dar-lhe alguma flexibilidade quando está a desenhar funções.
03:35Primeiro, argumentos apenas posicionais fazem sentido quando tem argumentos que têm uma ordem natural mas que são difíceis de dar bons nomes descritivos. Outro benefício de usar argumentos apenas posicionais é que você pode refactor mais facilmente suas funções – em particular, você pode mudar o nome de seus parâmetros sem se preocupar que outro código depende desses nomes.
03:57Para repetir essa informação, como você especifica argumentos apenas posicionais? Você usa a barra (/
) para denotar que os argumentos antes devem ser especificados por posição. Para saber mais sobre a nota cortada, PEP 457 fornece uma discussão aprofundada sobre isso. A PEP 570 mergulha muito mais profundamente nos parâmetros apenas de posicionamento Python. Links para ambos estão no texto abaixo deste vídeo.
04:20O complemento para argumentos apenas posicionais seriam argumentos apenas de palavras-chave, e estes estão disponíveis em qualquer versão do Python 3. Você pode especificar que deseja argumentos apenas com palavras-chave usando um asterisco (*
).
04:31Antes disso *
deve ser especificado usando uma palavra-chave. Aqui está um exemplo convertendo para Fahrenheit, e você pode ver aqui que ele tem um argumento só de palavra-chave de celsius
.
04:46Deixe que eu tente essa função. Então aqui, para especificar apenas a palavra-chave, você colocaria um *
e então colocaria o argumento da palavra-chave depois – neste caso, celsius
. E neste caso, volta
05:0232 + celsius * 9 / 5
. Então aqui, se você chamasse to_fahrenheit()
e apenas lhe desse um valor, digamos 40
graus Celsius, diz aqui que ele takes 0 positional arguments but 1 was given
.
05:16 Então era necessário que você tivesse uma palavra-chave lá para chamá-lo corretamente. E também, dependendo das suas circunstâncias, você pode querer combinar argumentos apenas posicionais, regulares, e apenas de palavras-chave. Para fazer isso, você os especificaria separados por essa barra (/
) e o asterisco (*
).
05:35 Então seria algo parecido com isto. Aqui, um posicional apenas de text
, a barra (/
). Aqui, o argumento padrão.
05:46 E agora, após o border
, usando o *
, o argumento chave de width
, que tem um valor padrão de 50
.
05:54 Você está retornando um f-string com um espaço na frente do valor para o argumento text
e depois outro espaço. E então você está usando o método de string de texto de .center()
com dois parâmetros que você está tirando desses argumentos, width
e border
.
06:08O único que é posicional é text
. Você poderia começar com headline()
e dizer "Positional-only"
.
06:18Aqui, você pode ver o valor padrão que será esse tipo de borda com um width
de 50
, parecendo algo parecido com isso. Novamente, uma vez que é apenas posicional, se você o desse text
,
06:35, isso iria levantar um erro, um TypeError
. Para border
, é um argumento regular. Então neste caso, você poderia dizer apenas um valor, digamos, o sinal de igual ("="
) em vez disso.
06:49Or você poderia realmente especificar que border
é igual, digamos, a dois pontos (:
). Ele aceitará qualquer um dos estilos. Mas o width
deve ser especificado usando uma palavra-chave se você for digitá-lo em…
07:07 sobrepondo-se ao padrão com um valor de 38
.
07:15 Se você fosse dar-lhe apenas o valor de 38
, isso novamente levantaria uma exceção, obtendo um TypeError: headline() takes 1 to 2 positional arguments
but 3 were given
. Então, mais uma vez, esse precisa ser um argumento de palavra-chave.
07:29 Então, como você pode ver, argumentos apenas posicionais podem complementar bem argumentos regulares e argumentos apenas de palavras-chave. No próximo vídeo, você aprenderá como o Python 3.8 melhora a verificação de tipos usando tipos mais precisos.